?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
目錄
該節(jié)描述了如何在MySQL中寫文字值。包括字符串、數(shù)值、十六進(jìn)制值、布爾值和NULL。本節(jié)還包括在MySQL中處理這些基本類型時(shí)會(huì)遇到的各種細(xì)微差別和“影印版”。
字符串指用單引號(hào)(‘'’)或雙引號(hào)(‘"’)引起來(lái)的字符序列。例如:
'a string'
"another string"
如果SQL服務(wù)器模式啟用了NSI_QUOTES,可以只用單引號(hào)引用字符串。用雙引號(hào)引用的字符串被解釋為一個(gè)識(shí)別符。
字符串可以有一個(gè)可選字符集引介詞和COLLATE子句:
[_charset_name]'string' [COLLATE collation_name]
例如:
SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;
關(guān)于這些字符串語(yǔ)法形式的詳細(xì)信息,參見(jiàn)10.3.7節(jié),“字符串文字字符集和校對(duì)”。
在字符串中,某些序列具有特殊含義。這些序列均用反斜線(‘\’)開(kāi)始,即所謂的轉(zhuǎn)義字符。MySQL識(shí)別下面的轉(zhuǎn)義序列:
\0 |
ASCII 0(NUL)字符。 |
\' |
單引號(hào)(‘'’)。 |
\" |
雙引號(hào)(‘"’)。 |
\b |
退格符。 |
\n |
換行符。 |
\r |
回車符。 |
\t |
tab字符。 |
\Z |
ASCII 26(控制(Ctrl)-Z)。該字符可以編碼為‘\Z’,以允許你解決在Windows中ASCII 26代表文件結(jié)尾這一問(wèn)題。(如果你試圖使用mysql db_name < file_name,ASCII 26會(huì)帶來(lái)問(wèn)題)。 |
\\ |
反斜線(‘\’)字符。 |
\% |
‘%’字符。參見(jiàn)表后面的注解。 |
\_ |
‘_’字符。參見(jiàn)表后面的注解。 |
這些序列對(duì)大小寫敏感。例如,‘\b’解釋為退格,但‘\B’解釋為‘B’。
‘\%’和‘\_’序列用于搜索可能會(huì)解釋為通配符的模式匹配環(huán)境中的‘%’和‘_’文字實(shí)例。參見(jiàn)12.3.1節(jié),“字符串比較函數(shù)”。請(qǐng)注意如果你在其它環(huán)境中使用‘\%’或‘\_’,它們返回字符串‘\%’和‘\_’,而不是‘%’和‘_’。
在其它轉(zhuǎn)義序列中,反斜線被忽略。也就是說(shuō),轉(zhuǎn)義字符解釋為仿佛沒(méi)有轉(zhuǎn)義。
有幾種方式可以在字符串中包括引號(hào):
·???????? 在字符串內(nèi)用‘'’引用的‘'’可以寫成‘''’。
·???????? 在字符串內(nèi)用‘"’引用的‘"’可以寫成‘""’。
·???????? 可以在引號(hào)前加轉(zhuǎn)義字符(‘\’)。
·???????? 在字符串內(nèi)用‘"’引用的‘'’不需要特殊處理,不需要用雙字符或轉(zhuǎn)義。同樣,在字符串內(nèi)用‘'’引用的‘"’也不需要特殊處理。
下面的SELECT語(yǔ)句顯示了引用和轉(zhuǎn)義如何工作:
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 |
+------------------------+
如果你想要在字符串列內(nèi)插入二進(jìn)制數(shù)據(jù)(例如BLOB),必須通過(guò)轉(zhuǎn)義序列表示下面的字符:
NUL |
NUL字節(jié)(ASCII 0)。用‘\0’表示該字符(反斜線后面跟一個(gè)ASCII‘0’字符)。 |
\ |
反斜線(ASCII 92)。用‘\\’表示該字符。 |
' |
單引號(hào)(ASCII 39)。用‘\'’表示該字符。 |
" |
雙引號(hào)(ASCII 34)。用‘\"’表示該字符。 |
當(dāng)編寫應(yīng)用程序時(shí),在包含這些特殊字符的字符串用于發(fā)送到MySQL服務(wù)器的SQL語(yǔ)句中的數(shù)據(jù)值之前,必須對(duì)它們正確進(jìn)行轉(zhuǎn)義??梢杂脙煞N方法來(lái)完成:
·???????? 用轉(zhuǎn)義特殊字符的函數(shù)處理字符串。例如,在C程序中,可以使用mysql_real_escape_string() C API函數(shù)來(lái)轉(zhuǎn)義字符。參見(jiàn)25.2.3.52節(jié),“mysql_real_escape_string()”。Perl DBI接口提供一個(gè)quote方法來(lái)將特殊字符轉(zhuǎn)換為正確的轉(zhuǎn)義序列。參見(jiàn)25.4節(jié),“MySQL Perl API”。
·???????? 顯式轉(zhuǎn)義特殊字符,許多MySQL API提供了占位符功能,允許你在查詢字符串中插入特殊標(biāo)記,然后當(dāng)你發(fā)出查詢時(shí)將數(shù)據(jù)值同它們綁定起來(lái)。在這種情況下,API關(guān)注轉(zhuǎn)義值中的特殊字符。
整數(shù)用一系列阿拉伯?dāng)?shù)字表示。浮點(diǎn)數(shù)使用‘.’作為十進(jìn)制間隔符。兩種類型的數(shù)值均可以在前面加一個(gè)‘-’來(lái)表示負(fù)值。
合法整數(shù)的例子:
1221
0
-32
合法浮點(diǎn)數(shù)的例子:
294.42
-32032.6809e+10
148.00
整數(shù)可以用在浮點(diǎn)環(huán)境中;它被解釋為與浮點(diǎn)數(shù)等效。
MySQL支持十六進(jìn)制值。在數(shù)字上下文中,十六進(jìn)制數(shù)如同整數(shù)(64位精度)。在字符串上下文,如同二進(jìn)制字符串,每對(duì)十六進(jìn)制數(shù)字被轉(zhuǎn)換為一個(gè)字符:
mysql> SELECT x'4D7953514C';
??????? -> 'MySQL'
mysql> SELECT 0xa+0;
??????? -> 10
mysql> SELECT 0x5061756c;
??????? -> 'Paul'
十六進(jìn)制值的默認(rèn)類型是字符串。如果想要確保該值作為數(shù)字處理,可以使用CAST(...AS UNSIGNED):
mysql> SELECT 0x41,CAST(0x41 AS UNSIGNED);
??????? -> 'A',65
0x語(yǔ)法基于ODBC。十六進(jìn)制字符串通常用于ODBC以便為BLOB列提供值。x’hexstring’語(yǔ)法基于標(biāo)準(zhǔn)SQL。
可以用HEX()函數(shù)將一個(gè)字符串或數(shù)字轉(zhuǎn)換為十六進(jìn)制格式的字符串:
mysql> SELECT HEX('cat');
??????? -> '636174'
mysql> SELECT 0x636174;
??????? -> 'cat'
可以使用b'value'符號(hào)寫位字段值。value是一個(gè)用0和1寫成的二進(jìn)制值。
位字段符號(hào)可以方便指定分配給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??????? |
+------+----------+----------+----------+
NULL值表示“沒(méi)有數(shù)據(jù)”。NULL可以寫成大寫或小寫。
請(qǐng)注意NULL值不同于數(shù)字類型的0或字符串類型的空字符串。參見(jiàn)A.5.3節(jié),“與NULL值有關(guān)的問(wèn)題”。
對(duì)于用LOAD DATA INFILE或SELECT ...INTO OUTFILE執(zhí)行的文本文件導(dǎo)入或?qū)С霾僮鳎?span>NULL用序列\N表示。參見(jiàn)13.2.5節(jié),“LOAD DATA INFILE語(yǔ)法”。
數(shù)據(jù)庫(kù)、表、索引、列和別名是識(shí)別符。該節(jié)描述了在MySQL中識(shí)別符的允許的語(yǔ)法。
下面的表描述了每類識(shí)別符的最大長(zhǎng)度和允許的字符。
識(shí)別符 |
最大長(zhǎng)度(字節(jié)) |
允許的字符 |
數(shù)據(jù)庫(kù) |
64 |
目錄名允許的任何字符,不包括‘/’、‘\’或者‘。’ |
表 |
64 |
文件名允許的任何字符,不包括‘/’、‘\’或者‘。’ |
列 |
64 |
所有字符 |
索引 |
64 |
所有字符 |
別名 |
255 |
所有字符 |
除了表內(nèi)注明的限制,識(shí)別符不可以包含ASCII 0或值為255的字節(jié)。數(shù)據(jù)庫(kù)、表和列名不應(yīng)以空格結(jié)尾。在識(shí)別符中可以使用引號(hào)識(shí)別符,盡管應(yīng)盡可能避免這樣使用。
識(shí)別符用Unicode(UTF8)保存。在.frm文件中保存的表定義的識(shí)別符和在mysql數(shù)據(jù)庫(kù)中的授權(quán)表保存的識(shí)別符也用Unicode(UTF8)保存。在MySQL 5.1中授權(quán)表(和其它表)的字符串列的大小等于字符個(gè)數(shù);這說(shuō)明(不象以前版本的MySQL)你可以在這些列保存的值中使用多字節(jié)字符而不需要降低字符個(gè)數(shù)。
識(shí)別符可以引起來(lái)也可以不引起來(lái)。如果識(shí)別符是一個(gè)保留字或包含特殊字符,無(wú)論何時(shí)使用,必須將它引起來(lái)。關(guān)于保留字的列表參見(jiàn)9.6節(jié),“MySQL中保留字的處理”。特殊字符指那些當(dāng)前字符集、‘_’和‘$’之外的文字?jǐn)?shù)字字符集。
識(shí)別符的引用符是反勾號(hào)(‘`’):
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
如果SQL服務(wù)器模式包括ANSI_QUOTES模式選項(xiàng),還可以用雙引號(hào)將識(shí)別符引起來(lái):
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)
參見(jiàn)5.3.2節(jié),“SQL服務(wù)器模式”。
如果你引用識(shí)別符,可以在識(shí)別符內(nèi)包括識(shí)別符引用符。如果識(shí)別符內(nèi)包括的字符與引用識(shí)別符的字符相同,則需要用雙字符。下面的語(yǔ)句創(chuàng)建一個(gè)名為a`b包含列c"d的表:
mysql> CREATE TABLE `a``b` (`c"d` INT);
建議不要使用XeX模式的名,例如1e或2e2,因?yàn)轭愃?span>1e+1的表達(dá)式比較模糊。根據(jù)上下文,它可以解釋為表達(dá)式1e + 1或數(shù)字1e+1。
使用MD5產(chǎn)生表名時(shí)應(yīng)仔細(xì),因?yàn)樗赡墚a(chǎn)生不合法的表名,如上所述。
MySQL允許使用由單個(gè)識(shí)別符或多個(gè)識(shí)別符組成的名字。多部分名各組件之間應(yīng)以句點(diǎn)(‘.’)間隔開(kāi)。多部分名的開(kāi)頭部分作為限定詞,后面的識(shí)別符被解釋。
在MySQL中可以引用下面形式的列:
列參考 |
含義 |
col_name |
列col_name,查詢中使用的表包含有此名字的列。 |
tbl_name.col_name |
默認(rèn)數(shù)據(jù)庫(kù)中的表tbl_name的列col_name。 |
db_name.tbl_name.col_name |
數(shù)據(jù)庫(kù)db_name中的表tbl_name的列col_name。 |
?
如果多部分名的組件需要引用,應(yīng)分別將它們引起來(lái)而不要將整個(gè)名引起來(lái)。例如,`my-tables`.`my-column` 有效,而`my-tables.my-column`無(wú)效。
不需要在語(yǔ)句中為列指定tbl_name或db_name.tbl_name前綴,除非列會(huì)很模糊。假定表t1和t2各包含一個(gè)列c,你使用SELECT語(yǔ)句在t1和t2中搜索c。在這種情況下,c很模糊,因?yàn)樗谡Z(yǔ)句中使用的表內(nèi)不唯一。你必須用表名t1.c或t2.c限定它,表示指哪個(gè)表。同樣,要想用同一語(yǔ)句搜索數(shù)據(jù)庫(kù)db1中的表t和數(shù)據(jù)庫(kù)db2中的表t,你必須將那些表中的列指為db1.t.col_name和db2.t.col_name。
限定名中句點(diǎn)后面的字必須為一個(gè)識(shí)別符,因此不需要將它引起來(lái),即使是一個(gè)保留字。
語(yǔ)法.tbl_name表示當(dāng)前數(shù)據(jù)庫(kù)中的tbl_name。該語(yǔ)法與ODBC兼容,因?yàn)槟承?span>ODBC程序在表名前面加前綴‘.’字符。
在MySQL中,數(shù)據(jù)庫(kù)對(duì)應(yīng)數(shù)據(jù)目錄中的目錄。數(shù)據(jù)庫(kù)中的每個(gè)表至少對(duì)應(yīng)數(shù)據(jù)庫(kù)目錄中的一個(gè)文件(也可能是多個(gè),取決于存儲(chǔ)引擎)。因此,所使用操作系統(tǒng)的大小寫敏感性決定了數(shù)據(jù)庫(kù)名和表名的大小寫敏感性。這說(shuō)明在大多數(shù)Unix中數(shù)據(jù)庫(kù)名和表名對(duì)大小寫敏感,而在Windows中對(duì)大小寫不敏感。一個(gè)顯著的例外情況是Mac OS X,它基于Unix但使用默認(rèn)文件系統(tǒng)類型(HFS+),對(duì)大小寫不敏感。然而,Mac OS X也支持UFS卷,該卷對(duì)大小寫敏感,就像Unix一樣。參見(jiàn)1.8.4節(jié),“MySQL對(duì)標(biāo)準(zhǔn)SQL的擴(kuò)展”。
注釋:盡管在某些平臺(tái)中數(shù)據(jù)庫(kù)名和表名對(duì)大小寫不敏感,不應(yīng)在同一查詢中使用不同的大小寫來(lái)引用給定的數(shù)據(jù)庫(kù)或表。下面的查詢不會(huì)工作,因?yàn)樗瑫r(shí)引用了表my_tables和as MY_tables:
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
列、索引、存儲(chǔ)子程序和觸發(fā)器名在任何平臺(tái)上對(duì)大小寫不敏感,列的別名也不敏感。
默認(rèn)情況,表別名在Unix中對(duì)大小寫敏感,但在Windows或Mac OS X中對(duì)大小寫不敏感。下面的查詢?cè)?span>Unix中不會(huì)工作,因?yàn)樗瑫r(shí)引用了別名a和A:
mysql> SELECT col_name FROM tbl_name AS a
??? -> WHERE a.col_name = 1 OR A.col_name = 2;
然而,該查詢?cè)?span>Windows中是可以的。要想避免出現(xiàn)差別,最好采用一致的轉(zhuǎn)換,例如總是用小寫創(chuàng)建并引用數(shù)據(jù)庫(kù)名和表名。在大多數(shù)移植和使用中建議使用該轉(zhuǎn)換。
在MySQL中如何在硬盤上保存和使用表名和數(shù)據(jù)庫(kù)名由lower_case_tables_name系統(tǒng)變量確定,可以在啟動(dòng)mysqld時(shí)設(shè)置。lower_case_tables_name可以采用下面的任一值:
值 |
含義 |
0 |
使用CREATE TABLE或CREATE DATABASE語(yǔ)句指定的大寫和小寫在硬盤上保存表名和數(shù)據(jù)庫(kù)名。名稱比較對(duì)大小寫敏感。在Unix系統(tǒng)中的默認(rèn)設(shè)置即如此。請(qǐng)注意如果在大小寫不敏感的文件系統(tǒng)上用--lower-case-table-names=0強(qiáng)制設(shè)為0,并且使用不同的大小寫訪問(wèn)MyISAM表名,會(huì)導(dǎo)致索引破壞。 |
1 |
表名在硬盤上以小寫保存,名稱比較對(duì)大小寫敏感。MySQL將所有表名轉(zhuǎn)換為小寫以便存儲(chǔ)和查找。該行為也適合數(shù)據(jù)庫(kù)名和表的別名。該值為Windows和Mac OS X系統(tǒng)中的默認(rèn)值。 |
2 |
表名和數(shù)據(jù)庫(kù)名在硬盤上使用CREATE TABLE或CREATE DATABASE語(yǔ)句指定的大小寫進(jìn)行保存,但MySQL將它們轉(zhuǎn)換為小寫以便查找。名稱比較對(duì)大小寫敏感。注釋:只在對(duì)大小寫不敏感的文件系統(tǒng)上適用! InnoDB表名以小寫保存,例如lower_case_tables_name=1。 |
在Windows和Mac OS X中,lower_case_tables_name的 默認(rèn)值是1。
如果只在一個(gè)平臺(tái)上使用MySQL,通常不需要更改lower_case_tables_name變量。然而,如果你想要在對(duì)大小寫敏感不同的文件系統(tǒng)的平臺(tái)之間轉(zhuǎn)移表,會(huì)遇到困難。例如,在Unix中,my_tables和MY_tables是兩個(gè)不同的表,但在Windows中,這兩個(gè)表名相同。要想避免由于數(shù)據(jù)庫(kù)或表名的大小寫造成的數(shù)據(jù)轉(zhuǎn)移問(wèn)題,可使用兩個(gè)選項(xiàng):
·???????? 在任何系統(tǒng)中可以使用lower_case_tables_name=1。使用該選項(xiàng)的不利之處是當(dāng)使用SHOW TABLES或SHOW DATABASES時(shí),看不出名字原來(lái)是用大寫還是小寫。
·???????? 在Unix中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。這樣了可以保留數(shù)據(jù)庫(kù)名和表名的大小寫。不利之處是必須確保在Windows中查詢總是用正確大小寫引用數(shù)據(jù)庫(kù)名和表名。如果將查詢轉(zhuǎn)移到Unix中,由于在Unix中大小寫很重要,如果大小寫不正確,它們不工作。
例外:如果你正使用InnoDB表,在任何平臺(tái)上均應(yīng)將lower_case_tables_name設(shè)置為1,以強(qiáng)制將名轉(zhuǎn)換為小寫。
請(qǐng)注意在Unix中將lower_case_tables_name設(shè)置為1之前,重啟mysqld之前,必須先將舊的數(shù)據(jù)庫(kù)名和表名轉(zhuǎn)換為小寫。
可以先在用戶變量中保存值然后在以后引用它;這樣可以將值從一個(gè)語(yǔ)句傳遞到另一個(gè)語(yǔ)句。用戶變量與連接有關(guān)。也就是說(shuō),一個(gè)客戶端定義的變量不能被其它客戶端看到或使用。當(dāng)客戶端退出時(shí),該客戶端連接的所有變量將自動(dòng)釋放。
用戶變量的形式為@var_name,其中變量名var_name可以由當(dāng)前字符集的文字?jǐn)?shù)字字符、‘.’、‘_’和‘$’組成。 默認(rèn)字符集是cp1252 (Latin1)??梢杂?strong>mysqld的--default-character-set選項(xiàng)更改字符集。參見(jiàn)5.10.1節(jié),“數(shù)據(jù)和排序用字符集”。用戶變量名對(duì)大小寫不敏感。
設(shè)置用戶變量的一個(gè)途徑是執(zhí)行SET語(yǔ)句:
SET @var_name = expr [, @var_name = expr] ...
對(duì)于SET,可以使用=或:=作為分配符。分配給每個(gè)變量的expr可以為整數(shù)、實(shí)數(shù)、字符串或者NULL值。
也可以用語(yǔ)句代替SET來(lái)為用戶變量分配一個(gè)值。在這種情況下,分配符必須為:=而不能用=,因?yàn)樵诜?span>SET語(yǔ)句中=被視為一個(gè)比較 操作符:
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 |
+----------------------+------+------+------+
用戶變量可以用于表達(dá)式中。目前不包括明顯需要文字值的上下文中,例如SELECT語(yǔ)句的LIMIT子句,或者LOAD DATA語(yǔ)句的IGNORE number LINES子句。
如果使用沒(méi)有初始化的變量,其值是NULL。
如果用戶變量分配了一個(gè)字符串值,其字符集和校對(duì)規(guī)則與該字符串的相同。用戶變量的可壓縮性(coercibility)是隱含的。(即為表列值的相同的可壓縮性(coercibility)。
注釋:在SELECT語(yǔ)句中,表達(dá)式發(fā)送到客戶端后才進(jìn)行計(jì)算。這說(shuō)明在HAVING、GROUP BY或者ORDER BY子句中,不能使用包含SELECT列表中所設(shè)的變量的表達(dá)式。例如,下面的語(yǔ)句不能按期望工作:
mysql> SELECT (@aa:=id) AS a,(@aa+3) AS b 從tbl_name HAVING b=5;
HAVING子句中引用了SELECT列表中的表達(dá)式的別名,使用@aa。不能按期望工作:@aa不包含當(dāng)前行的值,而是前面所選的行的id值。
一般原則是不要在語(yǔ)句的一個(gè)部分為用戶變量分配一個(gè)值而在同一語(yǔ)句的其它部分使用該變量??赡軙?huì)得到期望的結(jié)果,但不能保證。
設(shè)置變量并在同一語(yǔ)句中使用它的另一個(gè)問(wèn)題是變量的默認(rèn)結(jié)果的類型取決于語(yǔ)句前面的變量類型。下面的例子說(shuō)明了該點(diǎn):
mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name;
對(duì)于該 SELECT語(yǔ)句,MySQL向客戶端報(bào)告第1列是一個(gè)字符串,并且將@a的所有訪問(wèn)轉(zhuǎn)換為字符串,即使@a在第2行中設(shè)置為一個(gè)數(shù)字。執(zhí)行完SELECT語(yǔ)句后,@a被視為下一語(yǔ)句的一個(gè)數(shù)字。
要想避免這種問(wèn)題,要么不在同一個(gè)語(yǔ)句中設(shè)置并使用相同的變量,要么在使用前將變量設(shè)置為0、0.0或者''以定義其類型。
未分配的變量有一個(gè)值NULL,類型為字符串。
MySQL可以訪問(wèn)許多系統(tǒng)和連接變量。當(dāng)服務(wù)器運(yùn)行時(shí)許多變量可以動(dòng)態(tài)更改。這樣通常允許你修改服務(wù)器操作而不需要停止并重啟服務(wù)器。
mysqld服務(wù)器維護(hù)兩種變量。全局變量影響服務(wù)器整體操作。會(huì)話變量影響具體客戶端連接的操作。
當(dāng)服務(wù)器啟動(dòng)時(shí),它將所有全局變量初始化為默認(rèn)值。這些默認(rèn)值可以在選項(xiàng)文件中或在命令行中指定的選項(xiàng)進(jìn)行更改。服務(wù)器啟動(dòng)后,通過(guò)連接服務(wù)器并執(zhí)行SET GLOBAL var_name語(yǔ)句,可以動(dòng)態(tài)更改這些全局變量。要想更改全局變量,必須具有SUPER權(quán)限。
服務(wù)器還為每個(gè)連接的客戶端維護(hù)一系列會(huì)話變量。在連接時(shí)使用相應(yīng)全局變量的當(dāng)前值對(duì)客戶端的會(huì)話變量進(jìn)行初始化。對(duì)于動(dòng)態(tài)會(huì)話變量,客戶端可以通過(guò)SET SESSION var_name語(yǔ)句更改它們。設(shè)置會(huì)話變量不需要特殊權(quán)限,但客戶端只能更改自己的會(huì)話變量,而不能更改其它客戶端的會(huì)話變量。
對(duì)于全局變量的更改可以被訪問(wèn)該全局變量的任何客戶端看見(jiàn)。然而,它只影響更改后連接的客戶的從該全局變量初始化的相應(yīng)會(huì)話變量。不影響目前已經(jīng)連接的客戶端的會(huì)話變量(即使客戶端執(zhí)行SET GLOBAL語(yǔ)句也不影響)。
可以使用幾種語(yǔ)法形式來(lái)設(shè)置或檢索全局或會(huì)話變量。下面的例子使用了sort_buffer_sizeas作為示例變量名。
要想設(shè)置一個(gè)GLOBAL變量的值,使用下面的語(yǔ)法:
mysql> SET GLOBAL sort_buffer_size=value;
mysql> SET @@global.sort_buffer_size=value;
要想設(shè)置一個(gè)SESSION變量的值,使用下面的語(yǔ)法:
mysql> SET SESSION sort_buffer_size=value;
mysql> SET @@session.sort_buffer_size=value;
mysql> SET sort_buffer_size=value;
LOCAL是SESSION的同義詞。
如果設(shè)置變量時(shí)不指定GLOBAL、SESSION或者LOCAL,默認(rèn)使用SESSION。參見(jiàn)13.5.3節(jié),“SET語(yǔ)法”。
要想檢索一個(gè)GLOBAL變量的值,使用下面的語(yǔ)法:
mysql> SELECT @@global.sort_buffer_size;
mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';
要想檢索一個(gè)SESSION變量的值,使用下面的語(yǔ)法:
mysql> SELECT @@sort_buffer_size;
mysql> SELECT @@session.sort_buffer_size;
mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';
這里,LOCAL也是SESSION的同義詞。
當(dāng)你用SELECT @@var_name搜索一個(gè)變量時(shí)(也就是說(shuō),不指定global.、session.或者local.),MySQL返回SESSION值(如果存在),否則返回GLOBAL值。
對(duì)于SHOW VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。
當(dāng)設(shè)置GLOBAL變量需要GLOBAL關(guān)鍵字但檢索時(shí)不需要它們的原因是防止將來(lái)出現(xiàn)問(wèn)題。如果我們移除一個(gè)與某個(gè)GLOBAL變量具有相同名字的SESSION變量,具有SUPER權(quán)限的客戶可能會(huì)意外地更改GLOBAL變量而不是它自己的連接的SESSION變量。如果我們添加一個(gè)與某個(gè)GLOBAL變量具有相同名字的SESSION變量,想更改GLOBAL變量的客戶可能會(huì)發(fā)現(xiàn)只有自己的SESSION變量被更改了。
關(guān)于系統(tǒng)啟動(dòng)選項(xiàng)和系統(tǒng)變量的詳細(xì)信息參見(jiàn)5.3.1節(jié),“mysqld命令行選項(xiàng)”和5.3.3節(jié),“服務(wù)器系統(tǒng)變量”。在5.3.3.1節(jié),“動(dòng)態(tài)系統(tǒng)變量”中列出了可以在運(yùn)行時(shí)設(shè)置的變量。
結(jié)構(gòu)式變量在兩個(gè)方面不同于常規(guī)系統(tǒng)變量:
·???????? 其值是一個(gè)含組件的結(jié)構(gòu),可以指定服務(wù)器參數(shù),一般緊密相關(guān)。
·???????? 可能是給定類型的結(jié)構(gòu)式變量的幾個(gè)實(shí)例。每個(gè)實(shí)例有一個(gè)不同的名,指向服務(wù)器維護(hù)的不同的資源。
MySQL 5.1支持結(jié)構(gòu)式變量類型,可以指定監(jiān)控鍵值緩存操作的參數(shù)。鍵值緩存結(jié)構(gòu)式變量有以下組件:
·???????? key_buffer_size
·???????? key_cache_block_size
·???????? key_cache_division_limit
·???????? key_cache_age_threshold
該節(jié)描述了引用結(jié)構(gòu)式變量的語(yǔ)法。在語(yǔ)法的例子中使用了鍵值緩存變量,但關(guān)于鍵值緩存如何操作的具體詳情在其它章節(jié)中,如 7.4.6節(jié),“MyISAM鍵高速緩沖”。
要引用結(jié)構(gòu)式變量實(shí)例的組件,可以使用instance_name.component_name格式的復(fù)合名。例如:
hot_cache.key_buffer_size
hot_cache.key_cache_block_size
cold_cache.key_cache_block_size
對(duì)于每個(gè)結(jié)構(gòu)式系統(tǒng)變量,總是預(yù)定義名為default的一個(gè)實(shí)例。如果不使用任何實(shí)例名引用結(jié)構(gòu)式變量的一個(gè)組件,default實(shí)例被使用。這樣,default.key_buffer_size和key_buffer_sizeboth均指向同一系統(tǒng)變量。
結(jié)構(gòu)式變量實(shí)例和組件的命名規(guī)則為:
·???????? 對(duì)于給定類型的結(jié)構(gòu)式變量,每個(gè)實(shí)例必須有一個(gè)在該類變量中唯一的一個(gè)名。但是,在不同類型的結(jié)構(gòu)式變量中實(shí)例名不需要唯一。例如,每個(gè)結(jié)構(gòu)式變量有一個(gè)實(shí)例default,因此在不同的變量類型中default不是唯一的。
·???????? 每個(gè)結(jié)構(gòu)式變量類型的組件名在所有系統(tǒng)變量名中必須是唯一的。如果不是這樣(也就是說(shuō),如果兩個(gè)不同類型的結(jié)構(gòu)式變量能夠共享組件成員名),將不清楚使用哪個(gè)默認(rèn)結(jié)構(gòu)式變量來(lái)用作沒(méi)有使用實(shí)例名限定的成員名。
·???????? 如果結(jié)構(gòu)式變量實(shí)例名作為未引起來(lái)的識(shí)別符不合法,將它用反勾號(hào)引起來(lái)作為識(shí)別符。例如,hot-cache不合法,但`hot-cache` 合法。
·???????? global、session和local不是合法實(shí)例名。這樣可以避免與引用非結(jié)構(gòu)式系統(tǒng)變量的符號(hào)的沖突,例如@@global.var_name。
目前,這前兩個(gè)規(guī)則不可能違背,因?yàn)槲ㄒ坏慕Y(jié)構(gòu)式變量類型是鍵值緩存。在將來(lái)創(chuàng)建其它類型的結(jié)構(gòu)式變量,這些規(guī)則將有重要的意義。
一個(gè)例外是,可以在可能出現(xiàn)簡(jiǎn)單變量名的上下文中使用復(fù)合名引用結(jié)構(gòu)式變量組件。例如,可以使用一個(gè)命令行選項(xiàng)未某個(gè)結(jié)構(gòu)式變量分配一個(gè)值:
shell> mysqld --hot_cache.key_buffer_size=64K
在選項(xiàng)文件中,使用:
[mysqld]
hot_cache.key_buffer_size=64K
如果用該選項(xiàng)啟動(dòng)服務(wù)器,除了默認(rèn)大小為8MB的默認(rèn)鍵值緩存,還創(chuàng)建一個(gè)名為hot_cache的鍵值緩存,大小為64KB。
假定你這樣啟動(dòng)服務(wù)器:
shell> mysqld --key_buffer_size=256K \
???????? --extra_cache.key_buffer_size=128K \
???????? --extra_cache.key_cache_block_size=2048
在這種情況下,服務(wù)器將默認(rèn)鍵值緩存的大小設(shè)定為256KB。(也可以寫成--default.key_buffer_size=256K)。 并且,服務(wù)器創(chuàng)建一個(gè)名為extra_cache的第2個(gè)鍵值緩存,大小為128KB,緩存表索引塊的塊緩存區(qū)的大小設(shè)置為2048字節(jié)。
在下面的例子中,用3個(gè)不同的鍵值緩存(大小比例為3:1:1)啟動(dòng)服務(wù)器:
shell> mysqld --key_buffer_size=6M \
??????? ?--hot_cache.key_buffer_size=2M \
???????? --cold_cache.key_buffer_size=2M
也可以在運(yùn)行時(shí)設(shè)置和檢索結(jié)構(gòu)式變量值。例如,要想將名為hot_cache的一個(gè)鍵值緩存的大小設(shè)置為10MB,使用下面任何一個(gè)語(yǔ)句:
mysql> SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024;
mysql> SET @@global.hot_cache.key_buffer_size = 10*1024*1024;
要想檢索緩存大小,執(zhí)行:
mysql> SELECT @@global.hot_cache.key_buffer_size;
但是,下面的語(yǔ)句不工作。變量不解釋為一個(gè)復(fù)合名,而是解釋為LIKE模式匹配操作的簡(jiǎn)單字符串:
mysql> SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';
這是一個(gè)在可能出現(xiàn)簡(jiǎn)單的變量名時(shí)使用結(jié)構(gòu)式變量名的例子。
MySQL服務(wù)器支持3種注釋風(fēng)格:
·???????? 從‘#’字符從行尾。
·???????? 從‘-- ’序列到行尾。請(qǐng)注意‘-- ’(雙破折號(hào))注釋風(fēng)格要求第2個(gè)破折號(hào)后面至少跟一個(gè)空格符(例如空格、tab、換行符等等)。該語(yǔ)法與標(biāo)準(zhǔn)SQL注釋語(yǔ)法稍有不同,后者將在1.8.5.7, “‘--’作為注釋起始標(biāo)記”中討論。
·???????? 從序列。結(jié)束序列不一定在同一行中,因此該語(yǔ)法允許注釋跨越多行。
下面的例子顯示了3種風(fēng)格的注釋:
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 + 1;
mysql> SELECT 1+
1;
上述的注釋語(yǔ)法適用于mysqld服務(wù)器如何分析SQL語(yǔ)句。發(fā)送到服務(wù)器之前,mysql客戶程序也執(zhí)行部分語(yǔ)句解析。(例如,它通過(guò)解析來(lái)確定在多語(yǔ)句行中的語(yǔ)句邊界)。
在MySQL 5.1中,mysql解析注釋的唯一局限性是結(jié)合該風(fēng)格的注釋定界符使用的嘆號(hào)標(biāo)記了有條件執(zhí)行的SQL語(yǔ)句部分。適用于交互式運(yùn)行mysql和將命令放入一個(gè)文件中,并以批處理模式使用mysql來(lái)處理mysql < file_name的文件。詳細(xì)信息和例子參見(jiàn)1.8.4節(jié),“MySQL對(duì)標(biāo)準(zhǔn)SQL的擴(kuò)展”。
嘗試使用一個(gè)識(shí)別符,例如使用嵌入式MySQL數(shù)據(jù)類型或函數(shù)名作為表名或列名,例如TIMESTAMP或GROUP,會(huì)造成一個(gè)常見(jiàn)問(wèn)題。允許你這樣操作(例如,ABS可以作為一個(gè)列名)。但是,默認(rèn)情況下,在數(shù)調(diào)用中在函數(shù)名和后面的‘(’字符之間不允許有空格。該要求使函數(shù)調(diào)用與列名引用不同。
該行為的不利結(jié)果是在某些上下文中省略一個(gè)空格會(huì)使識(shí)別符解釋為函數(shù)名。例如,該語(yǔ)句合法:
mysql> CREATE TABLE abs (val INT);
但省略abs后面的空格會(huì)造成語(yǔ)法錯(cuò)誤,因?yàn)槭÷院笤撜Z(yǔ)句好像要調(diào)用ABS()函數(shù):
mysql> CREATE TABLE abs(val INT);
如果SQL服務(wù)器模式包括IGNORE_SPACE模式值,服務(wù)器允許函數(shù)調(diào)用時(shí)在函數(shù)名和后面的‘(’字符之間有空格。這樣使函數(shù)名被視為保留字。結(jié)果是,與函數(shù)名相同的識(shí)別符必須按照9.2節(jié),“數(shù)據(jù)庫(kù)、表、索引、列和別名”中所描述的引起來(lái)。SQL服務(wù)器模式按照5.3.2節(jié),“SQL服務(wù)器模式”中所描述的進(jìn)行控制。
限定名中句點(diǎn)后面的字必須為一個(gè)識(shí)別符,因此不需要將它引起來(lái),即使它是一個(gè)保留字。
在MySQL中,下表中的字顯式被保留。其中大多數(shù)字進(jìn)制被標(biāo)準(zhǔn)SQL用作列名和/或表名(例如,GROUP)。少數(shù)被保留了,因?yàn)?span>MySQL需要它們,(目前)使用yacc解析程序。保留字被引起來(lái)后可以用作識(shí)別符。
ADD | ALL | ALTER |
ANALYZE | AND | AS |
ASC | ASENSITIVE | BEFORE |
BETWEEN | BIGINT | BINARY |
BLOB | BOTH | BY |
CALL | CASCADE | CASE |
CHANGE | CHAR | CHARACTER |
CHECK | COLLATE | COLUMN |
CONDITION | CONNECTION | CONSTRAINT |
CONTINUE | CONVERT | CREATE |
CROSS | CURRENT_DATE | CURRENT_TIME |
CURRENT_TIMESTAMP | CURRENT_USER | CURSOR |
DATABASE | DATABASES | DAY_HOUR |
DAY_MICROSECOND | DAY_MINUTE | DAY_SECOND |
DEC | DECIMAL | DECLARE |
DEFAULT | DELAYED | DELETE |
DESC | DESCRIBE | DETERMINISTIC |
DISTINCT | DISTINCTROW | DIV |
DOUBLE | DROP | DUAL |
EACH | ELSE | ELSEIF |
ENCLOSED | ESCAPED | EXISTS |
EXIT | EXPLAIN | FALSE |
FETCH | FLOAT | FLOAT4 |
FLOAT8 | FOR | FORCE |
FOREIGN | FROM | FULLTEXT |
GOTO | GRANT | GROUP |
HAVING | HIGH_PRIORITY | HOUR_MICROSECOND |
HOUR_MINUTE | HOUR_SECOND | IF |
IGNORE | IN | INDEX |
INFILE | INNER | INOUT |
INSENSITIVE | INSERT | INT |
INT1 | INT2 | INT3 |
INT4 | INT8 | INTEGER |
INTERVAL | INTO | IS |
ITERATE | JOIN | KEY |
KEYS | KILL | LABEL |
LEADING | LEAVE | LEFT |
LIKE | LIMIT | LINEAR |
LINES | LOAD | LOCALTIME |
LOCALTIMESTAMP | LOCK | LONG |
LONGBLOB | LONGTEXT | LOOP |
LOW_PRIORITY | MATCH | MEDIUMBLOB |
MEDIUMINT | MEDIUMTEXT | MIDDLEINT |
MINUTE_MICROSECOND | MINUTE_SECOND | MOD |
MODIFIES | NATURAL | NOT |
NO_WRITE_TO_BINLOG | NULL | NUMERIC |
ON | OPTIMIZE | OPTION |
OPTIONALLY | OR | ORDER |
OUT | OUTER | OUTFILE |
PRECISION | PRIMARY | PROCEDURE |
PURGE | RAID0 | RANGE |
READ | READS | REAL |
REFERENCES | REGEXP | RELEASE |
RENAME | REPEAT | REPLACE |
REQUIRE | RESTRICT | RETURN |
REVOKE | RIGHT | RLIKE |
SCHEMA | SCHEMAS | SECOND_MICROSECOND |
SELECT | SENSITIVE | SEPARATOR |
SET | SHOW | SMALLINT |
SPATIAL | SPECIFIC | SQL |
SQLEXCEPTION | SQLSTATE | SQLWARNING |
SQL_BIG_RESULT | SQL_CALC_FOUND_ROWS | SQL_SMALL_RESULT |
SSL | STARTING | STRAIGHT_JOIN |
TABLE | TERMINATED | THEN |
TINYBLOB | TINYINT | TINYTEXT |
TO | TRAILING | TRIGGER |
TRUE | UNDO | UNION |
UNIQUE | UNLOCK | UNSIGNED |
UPDATE | USAGE | USE |
USING | UTC_DATE | UTC_TIME |
UTC_TIMESTAMP | VALUES | VARBINARY |
VARCHAR | VARCHARACTER | VARYING |
WHEN | WHERE | WHILE |
WITH | WRITE | X509 |
XOR | YEAR_MONTH | ZEROFILL |
MySQL允許部分關(guān)鍵字用做未引起來(lái)的識(shí)別符,因?yàn)樵S多人以前曾使用過(guò)它們。下面列出了一些例子:
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP
這是MySQL參考手冊(cè)的翻譯版本,關(guān)于MySQL參考手冊(cè),請(qǐng)?jiān)L問(wèn)dev.mysql.com.。原始參考手冊(cè)為英文版,與英文版參考手冊(cè)相比,本翻譯版可能不是最新的。