վÄÚËÑË÷: ÇëÊäÈëËÑË÷¹ؼü´Ê
µ±ǰҳÃæ: ÔÚÏßÎĵµÊ×ҳ > MySQL 5.1²ο¼ÊֲáÖÐÎİæ

Chapter 9. Language Structure - MySQL 5.1²ο¼ÊֲáÖÐÎİæ

ç¬�9章:语言结构

本章讨论了使ç”�MySQL编写SQL语句的下面元素时所使用的规则:

·         字符串和数字等文字å€�

·         识别符,例如表和列名

·         用户和系统变é‡�

·         注释

·         保留å­�

9.1. 文字å€�

该节描述了如何在MySQL中写文字值。包括字符串、数值、十六进制值、布尔值和NULL。本节还包括åœ�MySQL中处理这些基本类型时会遇到的各种细微差别和“影印版”ã€�

9.1.1. 字符ä¸�

字符串指用单引号(â€�'â€�)或双引号(â€�"â€�)引起来的字符序列。例如:

'a string'
"another string"

如果SQL服务器模式启用了NSI_QUOTES,可以只用单引号引用字符串。用双引号引用的字符串被解释为一个识别符ã€�

字符串可以有一个可选字符集引介词和COLLATE子句ï¼�

[_charset_name]'string' [COLLATE collation_name]

例如ï¼�

SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;

关于这些字符串语法形式的详细信息,参è§�10.3.7节,“字符串文字字符集和校对â€�ã€�

在字符串中,某些序列具有特殊含义。这些序列均用反斜线(â€�\â€�)开始,即所谓的转义字符ã€�MySQL识别下面的转义序列:

\0

ASCII 0(NUL)字符ã€�

\'

单引å��(â€�'â€�)ã€�

\"

双引å��(â€�"â€�)ã€�

\b

退格符ã€�

\n

换行符ã€�

\r

回车符ã€�

\t

tab字符ã€�

\Z

ASCII 26(控制ï¼�Ctrlï¼�-Z)。该字符可以编码为â€�\Z’,以允许你解决åœ�Windowsä¸�ASCII 26代表文件结尾这一问题ã€�(如果你试图使ç”�mysql db_name < file_nameï¼�ASCII 26会带来问题)ã€�

\\

反斜çº�(â€�\â€�)字符ã€�

\%

â€�%’字符。参见表后面的注解ã€�

\_

â€�_’字符。参见表后面的注解ã€�

这些序列对大小写敏感。例如,â€�\b’解释为退格,但â€�\B’解释为â€�B’ã€�

â€�\%’和â€�\_’序列用于搜索可能会解释为通配符的模式匹配环境中的â€�%’和â€�_’文字实例。参è§�12.3.1节,“字符串比较函数â€�。请注意如果你在其它环境中使用â€�\%’或â€�\_’,它们返回字符串â€�\%’和â€�\_’,而不是â€�%’和â€�_’ã€�

在其它转义序列中,反斜线被忽略。也就是说,转义字符解释为仿佛没有转义ã€�

有几种方式可以在字符串中包括引号ï¼�

·         在字符串内用â€�'’引用的â€�'’可以写成â€�''’ã€�

·         在字符串内用â€�"’引用的â€�"’可以写成â€�""’ã€�

·         可以在引号前加转义字ç¬�(â€�\â€�)ã€�

·         在字符串内用â€�"’引用的â€�'’不需要特殊处理,不需要用双字符或转义。同样,在字符串内用â€�'’引用的â€�"’也不需要特殊处理ã€�

下面çš�SELECT语句显示了引用和转义如何工作ï¼�

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
 
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
 
mysql> SELECT 'This\nIs\nFour\nLines';
+--------------------+
| This
Is
Four
Lines |
+--------------------+
 
mysql> SELECT 'disappearing\ backslash';
+------------------------+
| disappearing backslash |
+------------------------+

如果你想要在字符串列内插入二进制数据(例如BLOB),必须通过转义序列表示下面的字符:

NUL

NUL字节(ASCII 0)。用â€�\0â€�表示该字ç¬�(反斜线后面跟一ä¸�ASCIIâ€�0’字ç¬�)ã€�

\

反斜çº�(ASCII 92)。用â€�\\’表示该字符ã€�

'

单引å��(ASCII 39)。用â€�\'’表示该字符ã€�

"

双引å��(ASCII 34)。用â€�\"’表示该字符ã€�

当编写应用程序时,在包含这些特殊字符的字符串用于发送到MySQL服务器的SQL语句中的数据值之前,必须对它们正确进行转义。可以用两种方法来完成:

·         用转义特殊字符的函数处理字符串。例如,åœ�C程序中,可以使用mysql_real_escape_string() C API函数来转义字符。参è§�25.2.3.52节,“mysql_real_escape_string()â€�ã€�Perl DBI接口提供一ä¸�quote方法来将特殊字符转换为正确的转义序列。参è§�25.4节,“MySQL Perl APIâ€�ã€�

·         显式转义特殊字符,许å¤�MySQL API提供了占位符功能,允许你在查询字符串中插入特殊标记,然后当你发出查询时将数据值同它们绑定起来。在这种情况下,API关注转义值中的特殊字符ã€�

9.1.2. 数å€�

整数用一系列阿拉伯数字表示。浮点数使用â€�.’作为十进制间隔符。两种类型的数值均可以在前面加一个â€�-’来表示负值ã€�

合法整数的例子:

1221
0
-32

合法浮点数的例子ï¼�

294.42
-32032.6809e+10
148.00

整数可以用在浮点环境中;它被解释为与浮点数等效ã€�

9.1.3. 十六进制å€�

MySQL支持十六进制值。在数字上下文中,十六进制数如同整数(64位精åº�)。在字符串上下文,如同二进制字符串,每对十六进制数字被转换为一个字符:

mysql> SELECT x'4D7953514C'�
        -> 'MySQL'
mysql> SELECT 0xa+0�
        -> 10
mysql> SELECT 0x5061756c�
        -> 'Paul'

十六进制值的默认类型是字符串。如果想要确保该值作为数字处理,可以使用CAST(...AS UNSIGNED)ï¼�

mysql> SELECT 0x41�CAST(0x41 AS UNSIGNED)�
        -> 'A'ï¼�65

0x语法基于ODBC。十六进制字符串通常用于ODBC以便ä¸�BLOB列提供值ã€�xâ€�hexstringâ€�语法基于标准SQLã€�

可以ç”�HEX()函数将一个字符串或数字转换为十六进制格式的字符串ï¼�

mysql> SELECT HEX('cat')�
        -> '636174'
mysql> SELECT 0x636174�
        -> 'cat'

9.1.4. 布尔å€�

常量TRUE等于1,常é‡�FALSE等于0。常量名可以写成大写或小写ã€�

mysql> SELECT TRUE�true�FALSE�false�
        -> 1ï¼�1ï¼�0ï¼�0

9.1.5. 位字段å€�

可以使用b'value'符号写位字段值ã€�value是一个用0å’�1写成的二进制值ã€�

位字段符号可以方便指定分配给BIT列的值:

mysql> CREATE TABLE t (b BIT(8));
mysql> INSERT INTO t SET b = b'11111111';
mysql> INSERT INTO t SET b = b'1010';
+------+----------+----------+----------+
| b+0  | BIN(b+0) | OCT(b+0) | HEX(b+0) |
+------+----------+----------+----------+
|  255 | 11111111 | 377      | FF       |
|   10 | 1010     | 12       | A        |
+------+----------+----------+----------+

9.1.6. NULLå€�

NULL值表示“没æœ�数据”ã€�NULL可以写成大写或小写ã€�

请注æ„�NULL值不同于数字类型çš�0或字符串类型的空字符串。参è§�A.5.3节,“与NULL值有关的问题â€�ã€�

对于ç”�LOAD DATA INFILEæˆ�SELECT ...INTO OUTFILE执行的文本文件导入或导出操作ï¼�NULL用序åˆ�\N表示。参è§�13.2.5节,“LOAD DATA INFILE语法â€�ã€�

9.2. 数据库、表、索引、列和别å��

数据库、表、索引、列和别名是识别符。该节描述了åœ�MySQL中识别符的允许的语法ã€�

下面的表描述了每类识别符的最大长度和允许的字符ã€�

识别ç¬�

最大长åº�(字节)

允许的字ç¬�

数据åº�

64

目录名允许的任何字符,不包括â€�/’、â€�\’或者â€�ã€�â€�

�

64

文件名允许的任何字符,不包括â€�/’、â€�\’或者â€�ã€�â€�

�

64

所有字ç¬�

索引

64

所有字ç¬�

别名

255

所有字ç¬�

除了表内注明的限制,识别符不可以包含ASCII 0或值为255的字节。数据库、表和列名不应以空格结尾。在识别符中可以使用引号识别符,尽管应尽可能避免这样使用ã€�

识别符用Unicode(UTF8)保存。在.frm文件中保存的表定义的识别符和åœ�mysql数据库中的授权表保存的识别符也用Unicode(UTF8)保存。在MySQL 5.1中授权表(和其它表)的字符串列的大小等于字符个数;这说明(不象以前版本çš�MySQL)你可以在这些列保存的值中使用多字节字符而不需要降低字符个数ã€�

识别符可以引起来也可以不引起来。如果识别符是一个保留字或包含特殊字符,无论何时使用ï¼�必须将它引起来。关于保留字的列表参è§�9.6节,“MySQL中保留字的处理â€�。特殊字符指那些当前字符集、â€�_’和â€�$’之外的文字数字字符集ã€�

识别符的引用符是反勾å��(â€�`â€�)ï¼�

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

如果SQL服务器模式包æ‹�ANSI_QUOTES模式选项,还可以用双引号将识别符引起来:

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax. (...)
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

参见5.3.2节,“SQL服务器模式â€�ã€�

如果你引用识别符,可以在识别符内包括识别符引用符。如果识别符内包括的字符与引用识别符的字符相同,则需要用双字符。下面的语句创建一个名ä¸�a`b包含åˆ�c"d的表ï¼�

mysql> CREATE TABLE `a``b` (`c"d` INT)�

建议不要使用XeX模式的名,例å¦�1eæˆ�2e2,因为类ä¼�1e+1的表达式比较模糊。根据上下文,它可以解释为表达式1e + 1或数å­�1e+1ã€�

使用MD5产生表名时应仔细,因为它可能产生不合法的表名,如上所述ã€�

9.2.1. 识别符限制条ä»�

MySQL允许使用由单个识别符或多个识别符组成的名字。多部分名各组件之间应以句点(â€�.â€�)间隔开。多部分名的开头部分作为限定词,后面的识别符被解释ã€�

åœ�MySQL中可以引用下面形式的列:

列参è€�

含义

col_name

åˆ�col_name,查询中使用的表包含有此名字的列ã€�

tbl_name.col_name

默认数据库中的表tbl_name的列col_nameã€�

db_name.tbl_name.col_name

数据åº�db_name中的è¡�tbl_name的列col_nameã€�

 

如果多部分名的组件需要引用,应分别将它们引起来而不要将整个名引起来。例如,`my-tables`.`my-column` 有效,è€�`my-tables.my-column`无效ã€�

不需要在语句中为列指å®�tbl_nameæˆ�db_name.tbl_name前缀,除非列会很模糊。假定表t1å’�t2各包含一个列c,你使用SELECT语句åœ�t1å’�t2中搜ç´�c。在这种情况下,c很模糊,因为它在语句中使用的表内不唯一。你必须用表å��t1.cæˆ�t2.c限定它,表示指哪个表。同样,要想用同一语句搜索数据åº�db1中的è¡�t和数据库db2中的è¡�t,你必须将那些表中的列指ä¸�db1.t.col_nameå’�db2.t.col_nameã€�

限定名中句点后面的字必须为一个识别符,因此不需要将它引起来,即使是一个保留字ã€�

语法.tbl_name表示当前数据库中çš�tbl_name。该语法ä¸�ODBC兼容,因为某äº�ODBC程序在表名前面加前缀â€�.’字符ã€�

9.2.2. 识别符大小写敏感æ€�

åœ�MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文ä»�(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。这说明在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。一个显著的例外情况æ˜�Mac OS X,它基于Unix但使用默认文件系统类åž�(HFS+),对大小写不敏感。然而,Mac OS X也支æŒ�UFS卷,该卷对大小写敏感,就åƒ�Unix一样。参è§�1.8.4节,“MySQL对标准SQL的扩展â€�ã€�

注释ï¼�尽管在某些平台中数据库名和表名对大小写不敏感,不应在同一查询中使用不同的大小写来引用给定的数据库或表。下面的查询不会工作,因为它同时引用了表my_tableså’�as MY_tablesï¼�

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

列、索引、存储子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感ã€�

默认情况,表别名åœ�Unix中对大小写敏感,但在Windowsæˆ�Mac OS X中对大小写不敏感。下面的查询åœ�Unix中不会工作,因为它同时引用了别名aå’�Aï¼�

mysql> SELECT col_name FROM tbl_name AS a
    -> WHERE a.col_name = 1 OR A.col_name = 2;

然而,该查询在Windows中是可以的。要想避免出现差别,最好采用一致的转换,例如总是用小写创建并引用数据库名和表名。在大多数移植和使用中建议使用该转换ã€�

åœ�MySQL中如何在硬盘上保存和使用表名和数据库名由lower_case_tables_name系统变量确定,可以在启动mysqld时设置ã€�lower_case_tables_name可以采用下面的任一值:

�

含义

0

使用CREATE TABLEæˆ�CREATE DATABASE语句指定的大写和小写在硬盘上保存表名和数据库名。名称比较对大小写敏感。在Unix系统中的默认设置即如此。请注意如果在大小写不敏感的文件系统上用--lower-case-table-names=0强制设为0,并且使用不同的大小写访é—�MyISAM表名,会导致索引破坏ã€�

1

表名在硬盘上以小写保存,名称比较对大小写敏感ã€�MySQL将所有表名转换为小写以便存储和查找。该行为也适合数据库名和表的别名。该值为Windowså’�Mac OS X系统中的默认值ã€�

2

表名和数据库名在硬盘上使ç”�CREATE TABLEæˆ�CREATE DATABASE语句指定的大小写进行保存,但MySQL将它们转换为小写以便查找。名称比较对大小写敏感ã€�æ³�释:å��在对大小写不敏感的文件系统上适用! InnoDB表名以小写保存,例如lower_case_tables_name=1ã€�

åœ�Windowså’�Mac OS X中,lower_case_tables_nameçš� 默认值是1ã€�

如果只在一个平台上使用MySQL,通常不需要更æ”�lower_case_tables_name变量。然而,如果你想要在对大小写敏感不同的文件系统的平台之间转移表,会遇到困难。例如,åœ�Unix中,my_tableså’�MY_tables是两个不同的表,但在Windows中,这两个表名相同。要想避免由于数据库或表名的大小写造成的数据转移问题,可使用两个选项ï¼�

·         在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使ç”�SHOW TABLESæˆ�SHOW DATABASES时,看不出名字原来是用大写还是小写ã€�

·         åœ�Unix中使ç”�lower_case_tables_name=0,在Windows中使ç”�lower_case_tables_name=2。这样了可以保留数据库名和表名的大小写。不利之处是必须确保åœ�Windows中查询总是用正确大小写引用数据库名和表名。如果将查询转移åˆ�Unix中,由于åœ�Unix中大小写很重要,如果大小写不正确,它们不工作ã€�

例外:如果你正使ç”�InnoDB表,在任何平台上均应å°�lower_case_tables_name设置ä¸�1,以强制将名转换为小写ã€�

请注意在Unix中将lower_case_tables_name设置ä¸�1之前,重å��mysqld之前,必须先将旧的数据库名和表名转换为小写ã€�

9.3. 用户变量

可以先在用户变量中保存值然后在以后引用它;这样可以将值从一个语句传递到另一个语句ã€�用户变量与连接有å…�。也就是说,一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端连接的所有变量将自动释放ã€�

用户变量的形式为@var_name,其中变量名var_name可以由当前字符集的文字数字字符、â€�.’、â€�_’和â€�$’组成ã€� 默认字符集是cp1252 (Latin1)。可以用mysqldçš�--default-character-set选项更改字符集。参è§�5.10.1节,“数据和排序用字符集â€�。用户变量名对大小写不敏感ã€�

设置用户变量的一个途径是执è¡�SET语句ï¼�

SET @var_name = expr [, @var_name = expr] ...

对于SET,可以使ç”�=æˆ�:=作为分配符。分配给每个变量çš�expr可以为整数、实数、字符串或è€�NULL值ã€�

也可以用语句代替SET来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在é��SET语句ä¸�=被视为一个比è¾� 操作符:

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+

用户变量可以用于表达式中。目前不包括明显需要文字值的上下文中,例å¦�SELECT语句çš�LIMIT子句,或è€�LOAD DATA语句çš�IGNORE number LINES子句ã€�

如果使用没有初始化的变量,其值是NULLã€�

如果用户变量分配了一个字符串值,其字符集和校对规则与该字符串的相同。用户变量的可压缩性(coercibility)是隐含的ã€�(即为表列值的相同的可压缩性(coercibility)ã€�

注释ï¼�åœ�SELECT语句中,表达式发送到客户端后才进行计算。这说明åœ�HAVINGã€�GROUP BY或è€�ORDER BY子句中,不能使用包含SELECT列表中所设的变量的表达式。例如,下面的语句不能按期望工作ï¼�

mysql> SELECT (@aa:=id) AS a�(@aa+3) AS b �tbl_name HAVING b=5�

HAVING子句中引用了SELECT列表中的表达式的别名,使ç”�@aa。不能按期望工作ï¼�@aa不包含当前行的值,而是前面所选的行的id值ã€�

一般原则是不要在语句的一个部分为用户变量分配一个值而在同一语句的其它部分使用该变量。可能会得到期望的结果,但不能保证ã€�

设置变量并在同一语句中使用它的另一个问题是变量的默认结果的类型取决于语句前面的变量类型。下面的例子说明了该点:

mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name;

对于è¯� SELECT语句ï¼�MySQL向客户端报告ç¬�1列是一个字符串,并且将@a的所有访问转换为字符串,即使@a在第2行中设置为一个数字。执行完SELECT语句后,@a被视为下一语句的一个数字ã€�

要想避免这种问题,要么不在同一个语句中设置并使用相同的变量,要么在使用前将变量设置ä¸�0ã€�0.0或è€�''以定义其类型ã€�

未分配的变量有一个å€�NULL,类型为字符串ã€�

9.4. 系统变量

MySQL可以访问许多系统和连接变量。当服务器运行时许多变量可以动态更改。这样通常允许你修改服务器操作而不需要停止并重启服务器ã€�

mysqld服务器维护两种变量。全局变量影响服务器整体操作。会话变量影响具体客户端连接的操作ã€�

当服务器启动时,它将所有全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中指定的选项进行更改。服务器启动后,通过连接服务器并执行SET GLOBAL var_name语句,可以动态更改这些全局变量。要想更改全局变量,必须具æœ�SUPER权限ã€�

服务器还为每个连接的客户端维护一系列会话变量。在连接时使用相应全局变量的当前值对客户端的会话变量进行初始化。对于动态会话变量,客户端可以通过SET SESSION var_name语句更改它们。设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量,而不能更改其它客户端的会话变量ã€�

对于全局变量的更改可以被访问该全局变量的任何客户端看见。然而,它只影响更改后连接的客户的从该全局变量初始化的相应会话变量。不影响目前已经连接的客户端的会话变é‡�(即使客户端执è¡�SET GLOBAL语句也不影响)ã€�

可以使用几种语法形式来设置或检索全局或会话变量。下面的例子使用äº�sort_buffer_sizeas作为示例变量名ã€�

要想设置一ä¸�GLOBAL变量的值,使用下面的语法:

mysql> SET GLOBAL sort_buffer_size=value;
mysql> SET @@global.sort_buffer_size=value;

要想设置一ä¸�SESSION变量的值,使用下面的语法:

mysql> SET SESSION sort_buffer_size=value;
mysql> SET @@session.sort_buffer_size=value;
mysql> SET sort_buffer_size=value;

LOCALæ˜�SESSION的同义词ã€�

如果设置变量时不指定GLOBALã€�SESSION或è€�LOCAL,默认使ç”�SESSION。参è§�13.5.3节,“SET语法â€�ã€�

要想检索一ä¸�GLOBAL变量的值,使用下面的语法:

mysql> SELECT @@global.sort_buffer_size;
mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';

要想检索一ä¸�SESSION变量的值,使用下面的语法:

mysql> SELECT @@sort_buffer_size;
mysql> SELECT @@session.sort_buffer_size;
mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';

这里ï¼�LOCAL也是SESSION的同义词ã€�

当你ç”�SELECT @@var_name搜索一个变量时(也就是说,不指定global.ã€�session.或è€�local.)ï¼�MySQL返回SESSION值(如果存在),否则返回GLOBAL值ã€�

对于SHOW VARIABLES,如果不指定GLOBALã€�SESSION或è€�LOCALï¼�MySQL返回SESSION值ã€�

当设ç½�GLOBAL变量需è¦�GLOBAL关键字但检索时不需要它们的原因是防止将来出现问题。如果我们移除一个与某个GLOBAL变量具有相同名字çš�SESSION变量,具æœ�SUPER权限的客户可能会意外地更æ”�GLOBAL变量而不是它自己的连接的SESSION变量。如果我们添加一个与某个GLOBAL变量具有相同名字çš�SESSION变量,想更改GLOBAL变量的客户可能会发现只有自己çš�SESSION变量被更改了ã€�

关于系统启动选项和系统变量的详细信息参见5.3.1节,â€�mysqld命令行选项â€�å’�5.3.3节,“服务器系统变量â€�。在5.3.3.1节,“动态系统变量â€�中列出了可以在运行时设置的变量ã€�

9.4.1. 结构式系统变é‡�

结构式变量在两个方面不同于常规系统变量:

·         其值是一个含组件的结构,可以指定服务器参数,一般紧密相关ã€�

·         可能是给定类型的结构式变量的几个实例。每个实例有一个不同的名,指向服务器维护的不同的资源ã€�

MySQL 5.1支持结构式变量类型,可以指定监控键值缓存操作的参数。键值缓存结构式变量有以下组件:

·         key_buffer_size

·         key_cache_block_size

·         key_cache_division_limit

·         key_cache_age_threshold

该节描述了引用结构式变量的语法。在语法的例子中使用了键值缓存变量,但关于键值缓存如何操作的具体详情在其它章节中,如 7.4.6节,“MyISAM键高速缓冲â€�ã€�

要引用结构式变量实例的组件,可以使用instance_name.component_name格式的复合名。例如:

hot_cache.key_buffer_size
hot_cache.key_cache_block_size
cold_cache.key_cache_block_size

对于每个结构式系统变量,总是预定义名ä¸�default的一个实例。如果不使用任何实例名引用结构式变量的一个组件,default实例被使用。这样,default.key_buffer_sizeå’�key_buffer_sizeboth均指向同一系统变量ã€�

结构式变量实例和组件的命名规则为ï¼�

·         对于给定类型的结构式变量,每个实例必须有一个在该类变量中唯一的一个名。但是,在不同类型的结构式变量中实例名不需要唯一。例如,每个结构式变量有一个实ä¾�default,因此在不同的变量类型中default不是唯一的ã€�

·         每个结构式变量类型的组件名在所有系统变量名中必须是唯一的。如果不是这æ �(也就是说,如果两个不同类型的结构式变量能够共享组件成员名),将不清楚使用哪个默认结构式变量来用作没有使用实例名限定的成员名ã€�

·         如果结构式变量实例名作为未引起来的识别符不合法,将它用反勾号引起来作为识别符。例如,hot-cache不合法,ä½�`hot-cache` 合法ã€�

·         globalã€�sessionå’�local不是合法实例名。这样可以避免与引用非结构式系统变量的符号的冲突,例å¦�@@global.var_nameã€�

目前,这前两个规则不可能违背,因为唯一的结构式变量类型是键值缓存。在将来创建其它类型的结构式变量,这些规则将有重要的意义ã€�

一个例外是,可以在可能出现简单变量名的上下文中使用复合名引用结构式变量组件。例如,可以使用一个命令行选项未某个结构式变量分配一个值:

shell> mysqld --hot_cache.key_buffer_size=64K

在选项文件中,使用ï¼�

[mysqld]
hot_cache.key_buffer_size=64K

如果用该选项启动服务器,除了默认大小ä¸�8MB的默认键值缓存,还创建一个名ä¸�hot_cache的键值缓存,大小ä¸�64KBã€�

假定你这样启动服务器ï¼�

shell> mysqld --key_buffer_size=256K \
         --extra_cache.key_buffer_size=128K \
         --extra_cache.key_cache_block_size=2048

在这种情况下,服务器将默认键值缓存的大小设定ä¸�256KBã€�(也可以写æˆ�--default.key_buffer_size=256Kï¼�ã€� 并且,服务器创建一个名ä¸�extra_cache的第2个键值缓存,大小ä¸�128KB,缓存表索引块的块缓存区的大小设置为2048字节ã€�

在下面的例子中,ç”�3个不同的键值缓存(大小比例ä¸�3:1:1)启动服务器ï¼�

shell> mysqld --key_buffer_size=6M \
         --hot_cache.key_buffer_size=2M \
         --cold_cache.key_buffer_size=2M

也可以在运行时设置和检索结构式变量值。例如,要想将名ä¸�hot_cache的一个键值缓存的大小设置ä¸�10MB,使用下面任何一个语句:

mysql> SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024;
mysql> SET @@global.hot_cache.key_buffer_size = 10*1024*1024;

要想检索缓存大小,执行ï¼�

mysql> SELECT @@global.hot_cache.key_buffer_size;

但是,下面的语句不工作。变量不解释为一个复合名,而是解释ä¸�LIKE模式匹配操作的简单字符串ï¼�

mysql> SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';

这是一个在可能出现简单的变量名时使用结构式变量名的例子ã€�

9.5. 注释语法

MySQL服务器支æŒ�3种注释风格:

·         从â€�#’字符从行尾ã€�

·         从â€�-- ’序列到行尾。请注意â€�-- â€�(双破折号)注释风格要求ç¬�2个破折号后面至少跟一个空格符(例如空格ã€�tab、换行符等等)。该语法与标å‡�SQL注释语法稍有不同,后者将åœ�1.8.5.7, “â€�--’作为注释起始标记â€�中讨论ã€�

·         ä»�/*序列到后面的*/序列。结束序列不一定在同一行中,因此该语法允许注释跨越多行ã€�

下面的例子显示了3种风格的注释ï¼�

mysql> SELECT 1+1;     # This comment continues to the end of line
mysql> SELECT 1+1;     -- This comment continues to the end of line
mysql> SELECT 1 /* this is an in-line comment */ + 1;
mysql> SELECT 1+
/*
this is a
multiple-line comment
*/
1;

上述的注释语法适用äº�mysqld服务器如何分æž�SQL语句。发送到服务器之前,mysql客户程序也执行部分语句解析ã€�(例如,它通过解析来确定在多语句行中的语句边界ï¼�ã€�

åœ�MySQL 5.1中,mysql解析/* ...*/注释的唯一局限性是结合该风格的注释定界符使用的叹号标记了有条件执行çš�SQL语句部分。适用于交互式运行mysql和将命令放入一个文件中,并以批处理模式使用mysql来处ç��mysql < file_name的文件。详细信息和例子参见1.8.4节,“MySQL对标准SQL的扩展â€�ã€�

9.6. MySQL中保留字的处ç��

尝试使用一个识别符,例如使用嵌入式MySQL数据类型或函数名作为表名或列名,例如TIMESTAMPæˆ�GROUP,会造成一个常见问题。允许你这样操作(例如ï¼�ABS可以作为一个列å��)。但是,默认情况下,在数调用中在函数名和后面的â€�(’字符之间不允许有空格。该要求使函数调用与列名引用不同ã€�

该行为的不利结果是在某些上下文中省略一个空格会使识别符解释为函数名。例如,该语句合法:

mysql> CREATE TABLE abs (val INT)�

但省ç•�abs后面的空格会造成语法错误,因为省略后该语句好像要调用ABS()函数ï¼�

mysql> CREATE TABLE abs(val INT);

如果SQL服务器模式包æ‹�IGNORE_SPACE模式值,服务器允许函数调用时在函数名和后面的â€�(’字符之间有空格。这样使函数名被视为保留字。结果是,与函数名相同的识别符必须按ç…�9.2节,“数据库、表、索引、列和别名â€�中所描述的引起来ã€�SQL服务器模式按ç…�5.3.2节,“SQL服务器模式â€�中所描述的进行控制ã€�

限定名中句点后面的字必须为一个识别符,因此不需要将它引起来,即使它是一个保留字ã€�

åœ�MySQL中,下表中的字显式被保留。其中大多数字进制被标准SQL用作列名å’�/或表å��(例如ï¼�GROUP)。少数被保留了,因为MySQL需要它们,(目前)使用yacc解析程序。保留字被引起来后可以用作识别符ã€�

ADDALLALTER
ANALYZEANDAS
ASCASENSITIVEBEFORE
BETWEENBIGINTBINARY
BLOBBOTHBY
CALLCASCADECASE
CHANGECHARCHARACTER
CHECKCOLLATECOLUMN
CONDITIONCONNECTIONCONSTRAINT
CONTINUECONVERTCREATE
CROSSCURRENT_DATECURRENT_TIME
CURRENT_TIMESTAMPCURRENT_USERCURSOR
DATABASEDATABASESDAY_HOUR
DAY_MICROSECONDDAY_MINUTEDAY_SECOND
DECDECIMALDECLARE
DEFAULTDELAYEDDELETE
DESCDESCRIBEDETERMINISTIC
DISTINCTDISTINCTROWDIV
DOUBLEDROPDUAL
EACHELSEELSEIF
ENCLOSEDESCAPEDEXISTS
EXITEXPLAINFALSE
FETCHFLOATFLOAT4
FLOAT8FORFORCE
FOREIGNFROMFULLTEXT
GOTOGRANTGROUP
HAVINGHIGH_PRIORITYHOUR_MICROSECOND
HOUR_MINUTEHOUR_SECONDIF
IGNOREININDEX
INFILEINNERINOUT
INSENSITIVEINSERTINT
INT1INT2INT3
INT4INT8INTEGER
INTERVALINTOIS
ITERATEJOINKEY
KEYSKILLLABEL
LEADINGLEAVELEFT
LIKELIMITLINEAR
LINESLOADLOCALTIME
LOCALTIMESTAMPLOCKLONG
LONGBLOBLONGTEXTLOOP
LOW_PRIORITYMATCHMEDIUMBLOB
MEDIUMINTMEDIUMTEXTMIDDLEINT
MINUTE_MICROSECONDMINUTE_SECONDMOD
MODIFIESNATURALNOT
NO_WRITE_TO_BINLOGNULLNUMERIC
ONOPTIMIZEOPTION
OPTIONALLYORORDER
OUTOUTEROUTFILE
PRECISIONPRIMARYPROCEDURE
PURGERAID0RANGE
READREADSREAL
REFERENCESREGEXPRELEASE
RENAMEREPEATREPLACE
REQUIRERESTRICTRETURN
REVOKERIGHTRLIKE
SCHEMASCHEMASSECOND_MICROSECOND
SELECTSENSITIVESEPARATOR
SETSHOWSMALLINT
SPATIALSPECIFICSQL
SQLEXCEPTIONSQLSTATESQLWARNING
SQL_BIG_RESULTSQL_CALC_FOUND_ROWSSQL_SMALL_RESULT
SSLSTARTINGSTRAIGHT_JOIN
TABLETERMINATEDTHEN
TINYBLOBTINYINTTINYTEXT
TOTRAILINGTRIGGER
TRUEUNDOUNION
UNIQUEUNLOCKUNSIGNED
UPDATEUSAGEUSE
USINGUTC_DATEUTC_TIME
UTC_TIMESTAMPVALUESVARBINARY
VARCHARVARCHARACTERVARYING
WHENWHEREWHILE
WITHWRITEX509
XORYEAR_MONTHZEROFILL

MySQL允许部分关键字用做未引起来的识别符,因为许多人以前曾使用过它们。下面列出了一些例子:

  • ACTION

  • BIT

  • DATE

  • ENUM

  • NO

  • TEXT

  • TIME

  • TIMESTAMP


这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访é—�dev.mysql.com.。原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的ã€�