| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
MySQL> SELECT "This\nIs\nFour\nlines";
+--------------------+
| This
Is
Four
lines |
+--------------------+
如果你想要把二進制數據插入到一個字符類型的字段中(例如BLOB),下列字符必須由轉義序列表示:
NUL
ASCII 0,你應該用 “\0”(一個反斜線和一個ASCII “0”字符)表示它。
\
ASCII 92,反斜線。需要用 “\\” 表示。
'
ASCII 39,單引號。需要用 “'” 表示。
"
ASCII 34,雙引號。需要用 “"” 表示。
如果你寫 C 代碼,你可以使用 C API 函數MySQL_real_escape_string() 來為 INSERT 語句轉義字符。查看章節 8.1.2 C API 函數概述。在 Perl 中,你可以使用 DBI 包中的 quote 方法來將這些特殊字符轉換成適當的轉義序列。查看章節 8.5.2 DBI 接口。
你應該在任何可能包含上述特殊字符的字符串中使用轉義函數!
另外,很多 MySQL API 提供了一些占位符處理能力,這允許你在查詢語句中插入特殊標記,然後在執行查詢時對它們綁定數據值。這樣,API 會自動為你從數值中轉換它們。
6.1.1.2 數字
整數被表示為一個數字序列。浮點數使用 “.” 作為一個十進制的分隔符。這兩種類型的數字可以前置 `-' 以表示一個負值。
有效整數的例子:
1221
0
-32
有效浮點數的例子:
294.42
-32032.6809e+10
148.00
一個整數可以在浮點語境中使用;它被解釋為等值的浮點數。
6.1.1.3 十六進制值
MySQL 支持十六進制數值。在數字的語境中,它們表現類似於一個整數(64位精度)。在字符串的語境中,它們表現類似於一個二進制的字符串,每一對十六進制數字被轉換為一個字符:
MySQL> SELECT x'4D7953514C';
-> MySQL
MySQL> SELECT 0xa+0;
-> 10
MySQL> SELECT 0x5061756c;
-> Paul
表達式 x'hexstring' (4.0 中新加入) 是基於 ANSI SQL 的,表達式 0x 是基於 ODBC 的。十六進制的字符串通常被 ODBC 用於為 BLOB 類型字段賦值。你可以通過 HEX() 將一個字符串或一個數值轉化為十六進制格式。
6.1.1.4 NULL 值
NULL 值並不意味著“無數據”,並且是不同於例如數字類型的 0 或字符串類型的空串。查看章節 A.5.3 NULL 值問題
標識符 最大長度 允許的字符
數據庫 64 一個目錄名中允許的任何字符,除了“/”、“\” 或 “.”。
表 64 一個文件名中允許的任何字符,除了 “/” 或 “.”。
列 64 所有的字符。
別名 255 所胡的字符。
注意,除了上面的,在一個標識符中還不能有 ASCII(0) 或 ASCII(255) 或引用字符。
注意,如果標識符是一個受限掉的詞或包含特殊的字符,當使用它時,必須以一個 ` (backtick) 來引用它。
MySQL> SELECT * FROM `select` WHERE `select`.id > 100;
查看章節 6.1.7 MySQL 對保留字挑剔嗎?。
在 MySQL 3.23.6 以前的版本中,命名規則如下:
* 一個名字可以由當前字符集中包含的文字與數字字符以及 “_” 和 “$” 組成。缺省字符集為 ISO-8859-1 Latin1;這可以通過改變 MySQLd 的 --default-character-set 的選項來改變。查看章節 4.6.1 用於數據和排序的字符集。
* 一個名字可以以在名字中合法的任何字符開始。特別地,一個名字可以以一個數字開始(這不同於許多其它的數據庫系統!)。但一個名字不能 僅僅 以數字組成。
* 不能在名字中使用 “.” 字符,因為它是用於擴充格式的,你可以用它引用列(見下面)。
建議不要使用象 1e 這樣的名字,因為一個表達式 1e+1 是存在二義性的。它可以被解釋為表達式 1e + 1 或數字 1e+1。
在 MySQL 中,你可以使用下列表格中的任一種方式引用一個列:
列引用 含義
col_name 列 col_name 來自查詢所用的任何一個表中對應字段
tbl_name.col_name 列 col_name 來自當前數據庫中的表 tbl_name
db_name.tbl_name.col_name 列 col_name 來自數據庫 db_name 中的表 tbl_name。這個形式從 MySQL 3.22 或以後版本開始可用。
`column_name` 該字段是一個關鍵詞或包含特殊字符。
在一條語句中的列引用中,不需要明確指定一個 tbl_name 或 db_name.tbl_name 前綴,除非這個引用存在二義性。例如,假設表 t1 和 t2 均包含一個字段 c,當用一個使用了 t1 和 t2 的 SELECT 檢索 c 時。在這種情況下,c 存在二義性,因為它在這個語句所使用的表中不是唯一的,因而必須通過寫出 t1.c 或 t2.c 來指明你所需的是哪個表。同樣的,如果從數據庫 db1 的表 t 和數據庫 db2 的表 t 中檢索,你必須用db1.t.col_name 和 db2.t.col_name 來指定引用哪個庫表的列。
句法 .tbl_name 意味著表 tbl_name 在當前數據庫中。這個句法是為了與 ODBC 兼容,因為一些 ODBC 程序以一個 “.” 字符作為表名的前綴。
6.1.3 名字的大小寫敏感性
在 MySQL 中,數據庫和表對就於那些目錄下的目錄和文件。因而,操作系統的敏感性決定數據庫和表命名的大小寫敏感。這就意味著數據庫和表名在 Windows 中是大小寫不敏感的,而在大多數類型的 Unix 系統中是大小寫敏感的。一個特例是 Mac OS X,當缺省的 HFS+ 文件系統使用時。然而 Mac OS X 還支持 UFS 卷,那些在 Mac OS X 是大小寫敏感的就如他們在任一 Unix 上一樣。查看章節 1.8.3 MySQL 對 ANSI SQL92 的擴展。
注意:盡管在 Windows 中數據庫與表名是忽略大小寫的,你不應該在同一個查詢中使用不同的大小寫來引用一個給定的數據庫和表。下面的查詢將不能工作,因為它以 my_table 和 MY_TABLE 引用一個表:
MySQL> SELECT * FROM my_table WHERE MY_TABLE.col=1;
列名與列的別名在所有的情況下均是忽略大小寫的。
表的別名是區分大小寫的。下面的查詢將不能工作,因為它用 a 和 A 引用別名:
MySQL> SELECT col_name FROM tbl_name AS a
-> WHERE a.col_name = 1 OR A.col_name = 2;
如果記憶數據庫和表名的字母大小寫有困難,建議采用一個一致一約定,例如總是以小寫字母創建數據庫和表。
避免這個問題的另一個辦法就是以 -O lower_case_table_names=1 參數啟動 MySQLd。缺省地在 Windows 中這個選項為 1 ,在 Unix 中為 0。
如果 lower_case_table_names 為 1 ,MySQL 將在存儲與查找時將所有的表名轉換為小寫字線。(從 MySQL 4.0.2 開始,這個選項同樣適用於數據庫名。) 注意,當你更改這個選項時,你必須在啟動 MySQLd 前首先將老的表名轉換為小寫字母。
如果將 MyISAM 從 Windows 移動到一個 Unix 磁盤中,在某些情況下你可能需要使用 “MySQL_fix_extensions” 工具來修正指定數據庫目錄下的文件擴展名(小寫字母 “.frm”,大寫字母 “.MYI” 和 “.MYD”)。“MySQL_fix_extensions” 存放在 “scripts” 子目錄下。
6.1.4 用戶變量
MySQL 支持連接特定(connection-specific)的用戶變量,用 @variablename 句法表示。一個變量名可以由當前字符集中包含的文字與數字字符以及 “_”、“$” 和 “.” 組成。缺少的字符集為 ISO-8859-1 Latin1;這可以通過改變 MySQLd 的--default-character-set 的選項來改變。查看章節 4.6.1 用於數據和排序的字符集。
變量不必被初始化。缺省地,他們的值為 NULL 並可以存儲一個整數、實數或字符串值。當連接線程退出時,這個線程的所有變量將會自動地被釋放。
你可以通過 SET 句法來設置一個變量:
SET @variable= { integer expression | real expression | string expression }
[,@variable= ...].
在語句中除了 SET 之外還可以直接為一個變量賦值。然而在這各情況下,賦值操作符為 := 而不是 =,因為 = 在非 SET 語句中是用於比較的:
MySQL> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+
您正在看的MySQL教程是:MySQL 語言參考。------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+
用戶變量可以用於表達式所允許的任何地方。注意,這在數字必須明確指定的語境中並不適用,例如,在 SELECT 的 LIMIT 子句中或一個 LOAD DATA 語句的 IGNORE number LINES 的子句中。
注意:在一個 SELECT 語句中,各個表達式只有在它被送到客戶端時才能被求值。這就意味著,在 HAVING、GROUP BY 或 ORDER BY 子句中,你不能使用一個包含在 SELECT 部份所設置變量的表達式。例如:下面的語句將不會按預期的運作:
MySQL> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
原因是因為 @aa 不會是當前行的值,而是前一個符合條件的行的 id 值。
規則就是在同一語句中決不賦值 和 使用同一個變量。
6.1.5 系統變量
從 MySQL 4.0.3 開始,我們提供了對大量的系統變量和連接變量的更好的訪問方式。你可以不需要關閉服務器就可以更改其中的大部變量值。
系統變量可分為兩種類型:線程特定(Thread-specific)或稱為連接特定(connection-specific)變量,它們是當前連接唯一的;全局變量,它們用於設置全局事件。全局變量也同樣被用於設置一個新連接的相應線程特定變量的初始值。
當 MySQLd 啟動時,所有的全局變量以命令行參數和選項文件內容初始化。可以通過 SET GLOBAL 命令更改這些值。當一個新的連接線程被建立時,將以全局變量值初始化線程特定變量,直到你執行一個新的 SET GLOBAL 命令時,線程特定變量才會改變。
為了設置一個 全局(GLOBAL) 變量值,可以使用下面的任一句法:(在這裡,我們以 sort_buffer_size 變量作為一個示例)
SET GLOBAL sort_buffer_size=value;
SET @@global.sort_buffer_size=value;
為了設置一個 會話(SESSION) 變量的值,可以使用下面任一句法:
SET SESSION sort_buffer_size=value;
SET @@session.sort_buffer_size=value;
SET sort_buffer_size=value;
如果你沒有明確指定 GLOBAL 或 SESSION,那麼默認地將是設置 SESSION。查看章節 5.5.6 SET 句法。
LOCAL 是 SESSION 的同義詞。
通過下面的任一命令可以檢索到一個 全局(GLOBAL) 變量值:
SELECT @@global.sort_buffer_size;
SHOW GLOBAL VARIABLES like 'sort_buffer_size';
通過下面的任一命令可以檢索到一個 會話(SESSION) 變量值:
SELECT @@session.sort_buffer_size;
SHOW SESSION VARIABLES like 'sort_buffer_size';
當 檢索 一個變量值時使用 @@variable_name 句法,或沒有指定 GLOBAL 或 SESSION 時,如果線程特定(thread-specific)的 (SESSION) 值存在,MySQL 將返回它。如果不存在,那麼 MySQL 將返回全局變量值。
在設置 全局(GLOBAL) 變量而不是在檢索他們的時候需要使用 GLOBAL ,是為了在之後引用一個同名的線程特定(thread-specific)變量或刪除同名的一個線程特定(thread-specific)變量時不至發生問題。在這種情況下,你可能無意間改變整個服務器的狀態而不是你自己的連接。
下面的列表是你可以使用 GLOBAL 或 SESSION 對它們進行更改和檢索的所有變量。
變量名 變量值類型 變量類型
autocommit bool SESSION
big_tables bool SESSION
binlog_cache_size num GLOBAL
bulk_insert_buffer_size num GLOBAL | SESSION
concurrent_insert bool GLOBAL
connect_timeout num GLOBAL
convert_character_set string SESSION
delay_key_write OFF | ON | ALL GLOBAL
delayed_insert_limit num GLOBAL
delayed_insert_timeout num GLOBAL
delayed_queue_size num GLOBAL
error_count num LOCAL
flush bool GLOBAL
flush_time num GLOBAL
foreign_key_checks bool SESSION
identity num SESSION
insert_id bool SESSION
interactive_timeout num GLOBAL | SESSION
join_buffer_size num GLOBAL | SESSION
key_buffer_size num GLOBAL
last_insert_id bool SESSION
local_infile bool GLOBAL
log_warnings bool GLOBAL
long_query_time num GLOBAL | SESSION
low_priority_updates bool GLOBAL | SESSION
max_allowed_packet num GLOBAL | SESSION
max_binlog_cache_size num GLOBAL
max_binlog_size num GLOBAL
max_connect_errors num GLOBAL
max_connections num GLOBAL
max_error_count num GLOBAL | SESSION
max_delayed_threads num GLOBAL
max_heap_table_size num GLOBAL | SESSION
max_join_size num GLOBAL | SESSION
max_sort_length num GLOBAL | SESSION
max_tmp_tables num GLOBAL
max_user_connections num GLOBAL
max_write_lock_count num GLOBAL
myisam_max_extra_sort_file_size num GLOBAL | SESSION
myisam_max_sort_file_size num GLOBAL | SESSION
myisam_sort_buffer_size num GLOBAL | S
您正在看的MySQL教程是:MySQL 語言參考。ESSION
net_buffer_length num GLOBAL | SESSION
net_read_timeout num GLOBAL | SESSION
net_retry_count num GLOBAL | SESSION
net_write_timeout num GLOBAL | SESSION
query_cache_limit num GLOBAL
query_cache_size num GLOBAL
query_cache_type enum GLOBAL
read_buffer_size num GLOBAL | SESSION
read_rnd_buffer_size num GLOBAL | SESSION
rpl_recovery_rank num GLOBAL
safe_show_database bool GLOBAL
server_id num GLOBAL
slave_compressed_protocol bool GLOBAL
slave_net_timeout num GLOBAL
slow_launch_time num GLOBAL
sort_buffer_size num GLOBAL | SESSION
sql_auto_is_null bool SESSION
sql_big_selects bool SESSION
sql_big_tables bool SESSION
sql_buffer_result bool SESSION
sql_log_binlog bool SESSION
sql_log_off bool SESSION
sql_log_update bool SESSION
sql_low_priority_updates bool GLOBAL | SESSION
sql_max_join_size num GLOBAL | SESSION
sql_quote_show_create bool SESSION
sql_safe_updates bool SESSION
sql_select_limit bool SESSION
sql_slave_skip_counter num GLOBAL
sql_warnings bool SESSION
table_cache num GLOBAL
table_type enum GLOBAL | SESSION
thread_cache_size num GLOBAL
timestamp bool SESSION
tmp_table_size enum GLOBAL | SESSION
tx_isolation enum GLOBAL | SESSION
version string GLOBAL
wait_timeout num GLOBAL | SESSION
warning_count num LOCAL
unique_checks bool SESSION
以 num 標記的變量可以設置一個數字值。以 bool 標記的變量可以設置 0、1、ON 或 OFF。enum 類型的變量通常是設置為該變量的某一個可用值,但也可以設置為相對應的數字。(enum 的第一個值為 0)。
下面是某些變量的描述:
變量 描述
identity last_insert_id 的別名 (Sybase 兼容)
sql_low_priority_updates low_priority_updates 的別名
sql_max_join_size max_join_size 的別名
delay_key_write_for_all_tables 如它與 delay_key_write 一起被設置,那麼所有新打開的 MyISAM 表將使用 delayed key writes.
version VERSION() 的別名 (Sybase (?) 兼容)
在啟動選項章節中可以找到其它的變量的描述,SHOW VARIABLES 的描述在 SET 部分。查看章節 4.1.1 MySQLd 命令行選項。查看章節 4.5.6.4 SHOW VARIABLES。查看章節 5.5.6 SET 句法。
6.1.6 注釋句法
MySQL 服務器支持 # 到該行結束、-- 到該行結束 以及 /* 行中間或多個行 */ 的注釋方格:
MySQL> SELECT 1+1; # 這個注釋直到該行結束
MySQL> SELECT 1+1; -- 這個注釋直到該行結束
MySQL> SELECT 1 /* 這是一個在行中間的注釋 */ + 1;
MySQL> SELECT 1+
/*
這是一個
多行注釋的形式
*/
1;
注意 -- (雙長劃) 注釋風格要求在兩個長劃後至少有一個空格!
盡管服務器理解剛才描述的注釋句法,但 MySQL 客戶端的語法分析在 /* ... */ 注釋方式上還有所限止:
* 單引號和雙引號被用來標志一個被引用字符串的開始,即使是在一個注釋中。如果注釋中的引號沒有另一個引號與之配對,那和語法分析程序就不會認為注釋結束。如果你以交互式運行 mysql,你會產生困惑,因為提示符從 MySQL> 變為 '> 或 ">。
* 一個分號被用於指出當前 SQL 語句的結束並且跟隨它的任何東西表示下一行的開始。
不論你是以交互式運行 mysql 還是將命令放在一個文件中,然後以 mysql < some-file 告訴 MySQL 讀取它的輸入,這個限制均存在。
MySQL 支持 `--' ANSI SQL 注釋風格,但在兩個長劃後必須跟有一個空格。查看章節 1.8.4.7 `--' 作為一個注釋的開始。
6.1.7 MySQL 對保留字挑剔嗎?
一個常見的問題來於試圖使用 MySQL 內置的數據類型或函數名作為表的字段名來創建數據表,例如 TIMESTAMP 或 GROUP。但是,允許你這樣做(例如,ABS 是一個允許的列名),當使用函數名也是列名的函數時,函數名與後面跟著的 “(” 之間不允許存在空格。
您正在看的MySQL教程是:MySQL 語言參考。AYED
DELETE DESC DESCRIBE
DISTINCT DISTINCTROW DIV
DOUBLE DROP ELSE
ENCLOSED ERRORS ESCAPED
EXISTS EXPLAIN FALSE
FIELDS FLOAT FOR
FORCE FOREIGN FROM
FULLTEXT FUNCTION GRANT
GROUP HASH HAVING
HIGH_PRIORITY HOUR_MINUTE HOUR_SECOND
IF IGNORE IN
INDEX INFILE INNER
INNODB INSERT INT
INTEGER INTERVAL INTO
IS JOIN KEY
KEYS KILL LEADING
LEFT LIKE LIMIT
LINES LOAD LOCALTIME
LOCALTIMESTAMP LOCK LONG
LONGBLOB LONGTEXT LOW_PRIORITY
MASTER_SERVER_ID MATCH MEDIUMBLOB
MEDIUMINT MEDIUMTEXT MIDDLEINT
MINUTE_SECOND MOD MRG_MYISAM
NATURAL NOT NULL
NUMERIC ON OPTIMIZE
OPTION OPTIONALLY OR
ORDER OUTER OUTFILE
PRECISION PRIMARY PRIVILEGES
PROCEDURE PURGE READ
REAL REFERENCES REGEXP
RENAME REPLACE REQUIRE
RESTRICT RETURNS REVOKE
RIGHT RLIKE RTREE
SELECT SET SHOW
SMALLINT SOME SONAME
SPATIAL SQL_BIG_RESULT SQL_CALC_FOUND_ROWS
SQL_SMALL_RESULT SSL STARTING
STRAIGHT_JOIN STRIPED TABLE
TABLES TERMINATED THEN
TINYBLOB TINYINT TINYTEXT
TO TRAILING TRUE
TYPES UNION UNIQUE
UNLOCK UNSIGNED UPDATE
USAGE USE USER_RESOURCES
USING VALUES VARBINARY