第9章:語言結構

目錄

9.1. 文字值
9.1.1. 字串
9.1.2. 數值
9.1.3. 十六進制值
9.1.4. 布爾值
9.1.5. 位元值
9.1.6. NULL值
9.2. 資料庫、資料表、索引、列和別名
9.2.1. 識別符限制條件
9.2.2. 識別符大小寫敏感性
9.3. 用戶變數
9.4. 系統變數
9.4.1. 結構式系統變數
9.5. 註釋語法
9.6. MySQL中保留字的處理

本章討論了使用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』,以允許您解決在WindowsASCII 26代資料表檔案結尾這一問題。(如果您試圖使用mysql db_name < file_nameASCII 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資料表示該字元(反斜線後面跟一個ASCII0』字元)

\

反斜線(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 0x41CAST(0x41 AS UNSIGNED)
        -> 'A'65

0x語法基於ODBC。十六進制字串通常用於ODBC以便為BLOB列提供值。xhexstring語法基於標準SQL

可以用HEX()函數將一個字串或數字轉換為十六進制格式的字串:

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

9.1.4. 布爾值

常量TRUE等於1,常量FALSE等於0。常量名可以寫成大寫或小寫。

mysql> SELECT TRUEtrueFALSEfalse
        -> 1100

9.1.5. 位元值

可以使用b'value'符號寫位元值。value是一個用01寫成的二進制值。

位元符號可以方便指定分配給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 INFILESELECT ...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模式的名,例如1e2e2,因為類似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_namedb_name.tbl_name前綴,除非列會很模糊。假定資料表t1t2各包含一個列c,您使用SELECT語句在t1t2中搜索c。在這種情況下,c很模糊,因為它在語句中使用的資料表內不唯一。您必須用資料表名t1.ct2.c限定它,資料表示指哪個資料表。同樣,要想用同一語句搜索資料庫db1中的資料表t和資料庫db2中的資料表t,您必須將那些資料表中的列指為db1.t.col_namedb2.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_tablesas MY_tables

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

列、索引、儲存子程式和觸發器名在任何平台上對大小寫不敏感,列的別名也不敏感。

預設情況,資料表別名在Unix中對大小寫敏感,但在WindowsMac OS X中對大小寫不敏感。下面的查詢在Unix中不會工作,因為它同時引用了別名aA

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 TABLECREATE DATABASE語句指定的大寫和小寫在硬盤上保存資料表名和資料庫名。名稱比較對大小寫敏感。在Unix系統中的預設設置即如此。請注意如果在大小寫不敏感的檔案系統上用--lower-case-table-names=0強制設為0,並且使用不同的大小寫訪問MyISAM資料表名,會導致索引破壞。

1

資料表名在硬盤上以小寫保存,名稱比較對大小寫敏感。MySQL將所有資料表名轉換為小寫以便儲存和搜尋。該行為也適合資料庫名和資料表的別名。該值為WindowsMac OS X系統中的預設值。

2

資料表名和資料庫名在硬盤上使用CREATE TABLECREATE DATABASE語句指定的大小寫進行保存,但MySQL將它們轉換為小寫以便搜尋。名稱比較對大小寫敏感。釋:在對大小寫不敏感的檔案系統上適用! InnoDB資料表名以小寫保存,例如lower_case_tables_name=1

WindowsMac OS X中,lower_case_tables_name的 預設值是1

如果只在一個平台上使用MySQL,通常不需要更改lower_case_tables_name變數。然而,如果您想要在對大小寫敏感不同的檔案系統的平台之間轉移資料表,會遇到困難。例如,在Unix中,my_tablesMY_tables是兩個不同的資料表,但在Windows中,這兩個資料表名相同。要想避免由於資料庫或資料表名的大小寫造成的數據轉移問題,可使用兩個選項:

·         在任何系統中可以使用lower_case_tables_name=1。使用該選項的不利之處是當使用SHOW TABLESSHOW 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語句中,資料表達式發送到客戶端後才進行計算。這說明在HAVINGGROUP 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被視為下一語句的一個數字。

要想避免這種問題,要麼不在同一個語句中設置並使用相同的變數,要麼在使用前將變數設置為00.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;

LOCALSESSION的同義詞。

如果設置變數時不指定GLOBALSESSION或者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,如果不指定GLOBALSESSION或者LOCALMySQL返回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_sizekey_buffer_sizeboth均指向同一系統變數。

結構式變數實例和組件的命名規則為:

·         對於給定類型的結構式變數,每個實例必須有一個在該類變數中唯一的一個名。但是,在不同類型的結構式變數中實例名不需要唯一。例如,每個結構式變數有一個實例default,因此在不同的變數類型中default不是唯一的。

·         每個結構式變數類型的組件名在所有系統變數名中必須是唯一的。如果不是這樣(也就是說,如果兩個不同類型的結構式變數能夠共享組件成員名),將不清楚使用哪個預設結構式變數來用作沒有使用實例名限定的成員名。

·         如果結構式變數實例名作為未引起來的識別符不合法,將它用反勾號引起來作為識別符。例如,hot-cache不合法,但`hot-cache` 合法。

·         globalsessionlocal不是合法實例名。這樣可以避免與引用非結構式系統變數的符號的衝突,例如@@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數據類型或函數名作為資料表名或列名,例如TIMESTAMPGROUP,會造成一個常見問題。允許您這樣操作(例如,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.。原始參考手冊為英文版,與英文版參考手冊相比,本翻譯版可能不是最新的。