|
楼主 |
发表于 2009-4-13 13:13:59
|
显示全部楼层
1.8. MySQL标准的兼容性
在本节中,介绍了MySQL与ANSI/ISO SQL标准的关系。MySQL服务器有很多对SQL标准的扩展之处,这里介绍了它们是什么,以及使用它们的方法。你也能了解关于MySQL服务器缺失功能的信息,以及如何处理某些差异的方法。
SQL标准自1986年以来不断演化发展,有数种版本。在本手册中,“SQL-92”指得是1992年发布的标准,“SQL:1999”指得是1999年发布的标准,“SQL:2003”指得是标准的当前版本。我们采用术语“SQL标准”标示SQL标准的当前版本。
我们的目标是在没有良好理由的情况下不限制MySQL服务器的可用性。即使我们没有足够的资源就每种可能的应用进行开发,我们始终愿意帮助那些在新领域使用MySQL服务器的人员,并向他们提供建议。
对于该产品,我们的一项主要目标是,继续致力于与SQL标准的兼容性,但不以牺牲速度和可靠性为代价。如果它们能显著增加拥有大量用户基数的MySQL服务器的可用性,我们无惧于为SQL添加扩展,也无惧于为非SQL特性提供支持。MySQL服务器4.0中的HANDLER接口即是该策略的例子。请参见13.2.3节,“HANDLER语法”。
我们将继续支持事务性和非事务性数据库,以满足任务关键型全天候应用,以及高负载Web或日志应用。
MySQL服务器最初是为小型计算机系统上中等规模的数据库设计的(100万-1亿行,或每个表的大小为100MB)。目前,MySQL服务器能处理TB级别的数据库,也能在针对便携式设备或嵌入式设备的精简版本中使用。MySQL服务器的精简设计使得双向开发成为可能,不会在源码树中产生任何冲突。
目前,我们并未定位于实时支持,虽说MySQL复制特性提供了强大的功能。
在众多第三方簇解决方案中均有数据库簇支持特性,自4.1.2版以来,对于我们所需的NDB簇技术集成方案,同样请参见第17章:MySQL簇。
我们也正着手在数据库服务器中提供XML支持。
1.8.1. MySQL遵从的标准是什么
我们致力于支持全套ANSI/ISO SQL标准,但不会以牺牲代码的速度和质量为代价。
ODBC级别0-3.51。
1.8.2. 选择SQL模式
MySQL服务器能够工作在不同的SQL模式下,并能针对不同的客户端以不同的方式应用这些模式。这样,应用程序就能对服务器操作进行量身定制以满足自己的需求。
这类模式定义了MySQL应支持的SQL语法,以及应该在数据上执行何种确认检查。这样,就能在众多不同的环境下、与其他数据库服务器一起更容易地使用MySQL。
可以使用“--sql-mode="modes"”选项,通过启动mysqld来设置默认的SQL模式。从MySQL 4.1开始,也能在启动之后,使用ET [SESSION|GLOBAL] sql_mode='modes'语句,通过设置sql_mode变量更改模式。
关于设置服务器模式的更多信息,请参见5.3.2节,“SQL服务器模式”。
1.8.3. 在ANSI模式下运行MySQL
你可以使用“--ansi”启动选项,要求mysqld使用ANSI模式。请参见5.3.1节,“mysqld命令行选项”。
在ANSI模式下运行服务器与使用该选项启动它的效果一样(在一行上指定“--sql_mode”值):
--transaction-isolation=SERIALIZABLE--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE在MySQL 4.1中,能够用下述两条语句实现相同的效果(在一行上指定“sql_mode”值):
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;SET GLOBAL sql_mode = 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE';请参见1.8.2节,“选择SQL模式”。
在MySQL 4.1.1中,也能用下述语句设置sql_mode选项:
SET GLOBAL sql_mode='ansi';在本例中,将sql_mode变量的值设置为与ANSI模式相关的所有选项。你可以检查其结果,如下所示:
mysql> SET GLOBAL sql_mode='ansi';mysql> SELECT @@global.sql_mode; -> 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,ANSI';1.8.4. MySQL对标准SQL的扩展
MySQL服务器包含一些其他SQL DBMS中不具备的扩展。注意,如果使用了它们,将无法把代码移植到其他SQL服务器。在某些情况下,你可以编写包含MySQL扩展的代码,但仍保持其可移植性,方法是用“/*... */”注释掉这些扩展。在本例中,MySQL服务器能够解析并执行注释中的代码,就像对待其他MySQL语句一样,但其他SQL服务器将忽略这些扩展。例如:
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...如果在字符“!”后添加了版本号,仅当MySQL的版本等于或高于指定的版本号时才会执行注释中的语法:
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);这意味着,如果你的版本号为3.23.02或更高,MySQL服务器将使用TEMPORARY关键字。
下面按类别介绍了各种MySQL扩展。
· 磁盘上的数据组织
MySQL服务器会将每个数据库映射到MySQL数据目录下的1个目录中,并将数据库中的表映射到数据库目录下的文件名。它具有下述含义:
o 如果操作系统的文件名区分大小写(如大多数Unix系统),当MySQL服务器运行在这类操作系统上时,数据库名和表名也区分大小写。请参见9.2.2节,“识别符大小写敏感性”。
o 你可以使用标准的系统命令来备份、重命名、移动、删除、并拷贝由MyISAM或ISAM存储引擎管理的表。例如,要想重命名MyISAM表,可重命名表对应的.MYD、.MYI、以及.frm文件。
数据库、表、索引、列或别名能够以数字开头(但或许不能全部由数字构成)。
· 通用语言语法
o 可以使用“””或“’”括住字符串,而不仅是“’”。
o 在字符串中使用“\”作为转义字符。
o 在SQL语句中,可以使用“db_name.tbl_name”语法访问不同数据库中的表。某些SQL服务器提供了相同的功能,但调用该用户空间除外。MySQL服务器不支持表空间,如下述语句中使用的那样: CREATE TABLE ralph.my_table...IN my_tablespace.
· SQL语句的语法
o ANALYZE TABLE,CHECK TABLE,OPTIMIZE TABLE,以及REPAIR TABLE语句。
o CREATE DATABASE和DROP DATABASE语句。请参见13.1.3节,“CREATE DATABASE语法”。
o DO语句。
o EXPLAIN SELECT获取如何联合表的介绍。
o FLUSH和RESET语句。
o SET语句。请参见13.5.3节,“SET语法”。
o SHOW语句。请参见13.5.4节,“SHOW语法”。
o 使用LOAD DATA INFILE。在很多情况下,该语法与Oracle的LOAD DATA INFILE兼容。请参见13.2.5节,“LOAD DATA INFILE语法”。
o RENAME TABLE的使用。请参见13.1.9节,“RENAME TABLE语法”。
o 使用REPLACE取代DELETE + INSERT。请参见13.2.6节,“REPLACE语法”。
o 在ALTER TABLE语句中使用CHANGE col_name、DROP col_name、或DROP INDEX、IGNORE或RENAME。在ALTER TABLE语句中使用多个ADD、ALTER、DROP或CHANGE子句。请参见13.1.2节,“ALTER TABLE语法”。
o 使用索引名,字段前缀上的索引,并在CREATE TABLE语句中使用INDEX或KEY。请参见13.1.5节,“CREATE TABLE语法”。
o 与CREATE TABLE一起使用TEMPORARY或IF NOT EXISTS。
o 与DROP TABLE一起使用IF EXISTS。
o 使用单个DROP TABLE语句,能够舍弃多个表。
o UPDATE和DELETE语句的ORDER BY和LIMIT子句。
o INSERT INTO ... SET col_name = ... syntax.
o INSERT和REPLACE语句的DELAYED子句。
o INSERT、REPLACE、DELETE和UPDATE语句的LOW_PRIORITY子句。
o 在SELECT语句中使用INTO OUTFILE和STRAIGHT_JOIN。请参见13.2.7节,“SELECT语法”。
o SELECT语句中的SQL_SMALL_RESULT选项。
o 不需要在GROUP BY部分命名所有选择的列。对于某些十分特殊但相当正常的查询,它能提供更好的性能。请参见12.10节,“与GROUP BY子句同时使用的函数和修改程序”。
o 可以与GROUP BY一起指定ASC和DESC。
o 能够在带有“:=”赋值操作符的语句中设置变量。
o mysql> SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avgo -> FROM test_table;o mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;· 列类型
o 列类型MEDIUMINT、SET、ENUM、以及不同的BLOB和TEXT类型。
o 列属性AUTO_INCREMENT、BINARY、NULL、UNSIGNED以及ZEROFILL。
· 函数和操作符
o 为了使其他SQL环境下的用户更容易入手,MySQL服务器对很多函数均支持别名特性。例如,所有的字符串函数均支持标准SQL语法和ODBC语法。
o MySQL服务器能够理解“||”和“&&”操作符,将其当作逻辑OR和AND,就像在C编程语言中那样。在MySQL服务器中,||和OR是同义词,&&和AND也是同义词。由于采用了该优异的语法体系,MySQL服务器不支持SQL针对字符串连接的“||”操作符,而采用了CONCAT()取而代之。由于CONCAT()能够接受任意数目的参量,很容易将使用“||”操作符的情况转换为MySQL服务器支持的类型。
o 请在有多于1个元素的场合下使用COUNT(DISTINCT list)。
o 默认情况下,所有的字符串比较均区分大小写,其分类顺序由当前字符集确定(默认为cp1252 Latin1)。如果你不喜欢该点,应使用BINARY属性或BINARY cast声明列,这样,就会使用基本的字符代码值进行比较,而不是词汇顺序。
o “%”操作符等同于MOD()。也就是说“N % M”等同于MOD(N,M)。Cyuyan的程序员支持“%”,而且它也是为了兼容PostgreSQL而使用的。
o 在列比较中,可在SELECT语句的FROM左侧使用=、<>、<=、<、>=、>、<<、>>、<=>、AND、OR或LIKE操作符。例如: |
|