?
本文檔使用 PHP中文網手冊 發(fā)布
目錄
本章討論以下主題:
·???????? 什么是字符集和校對規(guī)則?
·???????? 多級默認系統(tǒng)
·???????? 字符集語法
·???????? 相關函數和運算
·???????? Unicode支持
·???????? 每個字符集和校對規(guī)則的含義
MySQL5.1中的字符集支持包括在MyISAM、MEMORY和InnoDB存儲引擎中。
字符集是一套符號和編碼。校對規(guī)則是在字符集內用于比較字符的一套規(guī)則。讓我們使用一個假想字符集的例子來區(qū)別清楚。
假設我們有一個字母表使用了四個字母:‘A’、‘B’、‘a’、‘b’。我們?yōu)槊總€字母賦予一個數值:‘A’=0,‘B’= 1,‘a’= 2,‘b’= 3。字母‘A’是一個符號,數字0是‘A’的編碼,這四個字母和它們的編碼組合在一起是一個字符集。
假設我們希望比較兩個字符串的值:‘A’和‘B’。比較的最簡單的方法是查找編碼:‘A’為0,‘B’為1。因為0 小于1,我們可以說‘A’小于‘B’。我們做的僅僅是在我們的字符集上應用了一個 校對規(guī)則。校對規(guī)則是一套規(guī)則(在這種情況下僅僅是一套規(guī)則):“對編碼進行比較。”我們稱這種全部可能的規(guī)則中的最簡單的 校對規(guī)則為一個binary(二元)校對規(guī)則。
但是,如果我們希望小寫字母和大寫字母是等價的,應該怎樣?那么,我們將至少有兩個規(guī)則:(1)把小寫字母‘a’和‘b’視為與‘A’和‘B’等價;(2)然后比較編碼。我們稱這是一個大小寫不敏感的 校對規(guī)則。比二元校對規(guī)則復雜一些。
在實際生活中,大多數字符集有許多字符:不僅僅是‘A’和‘B’,而是整個字母表,有時候有許多種字母表,或者一個東方的使用上千個字符的書寫系統(tǒng),還有許多特殊符號和標點符號。并且在實際生活中,大多數 校對規(guī)則有許多個規(guī)則:不僅僅是大小寫不敏感,還包括重音符不敏感(“重音符” 是附屬于一個字母的符號,象德語的‘?’符號)和多字節(jié)映射(例如,作為規(guī)則‘?’=‘OE’就是兩個德語 校對規(guī)則的一種)。
MySQL5.1能夠做這些事情:
·???????? 使用多種字符集來存儲字符串
·???????? 使用多種校對規(guī)則來比較字符串
·???????? 在同一臺服務器、同一個數據庫或甚至在同一個表中使用不同字符集或校對規(guī)則來混合字符串
·???????? 允許定義任何級別的字符集和校對規(guī)則
在這些方面,MySQL5.1不僅比MySQL4.1以前的版本靈活得多,而且比其它大多數數據庫管理系統(tǒng)超前許多。但是,為了有效地使用這些功能,你需要了解哪些字符集和 校對規(guī)則是可用的,怎樣改變默認值,以及它們怎樣影響字符操作符和字符串函數的行為。
MySQL服務器能夠支持多種字符集。可以使用SHOW CHARACTER SET語句列出可用的字符集:
mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset? | Description???????????????? | Default collation?? | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5???? | Big5 Traditional Chinese??? | big5_chinese_ci???? |????? 2 |
| dec8???? | DEC West European?????????? | dec8_swedish_ci???? |????? 1 |
| cp850??? | DOS West European?????????? | cp850_general_ci??? |????? 1 |
| hp8????? | HP West European??????????? | hp8_english_ci????? |????? 1 |
| koi8r??? | KOI8-R Relcom Russian?????? | koi8r_general_ci??? |????? 1 |
| latin1?? | cp1252???? West European??? | latin1_swedish_ci?? |????? 1 |
| latin2?? | ISO 8859-2 Central European | latin2_general_ci?? |????? 1 |
| swe7???? | 7bit Swedish??????????????? | swe7_swedish_ci???? |????? 1 |
| ascii? ??| US ASCII??????????????????? | ascii_general_ci??? |????? 1 |
| ujis???? | EUC-JP Japanese???????????? | ujis_japanese_ci??? |????? 3 |
| sjis???? | Shift-JIS Japanese????????? | sjis_japanese_ci??? |????? 2 |
| hebrew?? | ISO 8859-8 Hebrew?????????? | hebrew_general_ci?? |????? 1 |
| tis620?? | TIS620 Thai???????????????? | tis620_thai_ci????? |????? 1 |
| euckr??? | EUC-KR Korean?????????????? | euckr_korean_ci???? |????? 2 |
| koi8u??? | KOI8-U Ukrainian??????????? | koi8u_general_ci??? |????? 1 |
| gb2312?? | GB2312 Simplified Chinese?? | gb2312_chinese_ci?? |????? 2 |
| greek??? | ISO 8859-7 Greek??????????? | greek_general_ci??? |????? 1 |
| cp1250?? | Windows Central European??? | cp1250_general_ci?? |????? 1 |
| gbk????? | GBK Simplified Chinese? ????| gbk_chinese_ci????? |????? 2 |
| latin5?? | ISO 8859-9 Turkish????????? | latin5_turkish_ci?? |????? 1 |
...
(完整列表參見10.10節(jié),“MySQL支持的字符集和校對”。)
任何一個給定的字符集至少有一個校對規(guī)則。它可能有幾個校對規(guī)則。
要想列出一個字符集的校對規(guī)則,使用SHOW COLLATION語句。例如,要想查看latin1(“西歐ISO-8859-1”)字符集的 校對規(guī)則,使用下面的語句查找那些名字以latin1開頭的 校對規(guī)則:
mysql> SHOW COLLATION LIKE 'latin1%';
+---------------------+---------+----+---------+----------+---------+
| Collation?????????? | Charset | Id | Default | Compiled | Sortlen |
+---------------------+---------+----+---------+----------+---------+
| latin1_german1_ci?? | latin1? |? 5 |???????? |????????? |?????? 0 |
| latin1_swedish_ci?? | latin1? |? 8 | Yes???? | Yes????? |?????? 1 |
| latin1_danish_ci??? | latin1? | 15 |???????? |????????? |?????? 0 |
| latin1_german2_ci?? | latin1? | 31 |???????? | Yes????? |?????? 2 |
| latin1_bin????????? | latin1? | 47 |???????? | Yes????? |?????? 1 |
| latin1_general_ci?? | latin1? | 48 |???????? |????????? |?????? 0 |
| latin1_general_cs?? | latin1? | 49 |???????? |????????? |?????? 0 |
| latin1_spanish_ci?? | latin1? | 94 |???????? |????????? |?????? 0 |
+---------------------+---------+----+---------+----------+---------+
latin1校對規(guī)則有下面的含義:
校對規(guī)則 |
含義 |
latin1_german1_ci |
德國DIN-1 |
latin1_swedish_ci |
瑞典/芬蘭 |
latin1_danish_ci |
丹麥/挪威 |
latin1_german2_ci |
德國 DIN-2 |
latin1_bin |
符合latin1編碼的二進制 |
latin1_general_ci |
多種語言(西歐) |
latin1_general_cs |
多種語言(西歐ISO),大小寫敏感 |
latin1_spanish_ci |
現(xiàn)代西班牙 |
校對規(guī)則一般有這些特征:
·???????? 兩個不同的字符集不能有相同的校對規(guī)則。
·???????? 每個字符集有一個默認校對規(guī)則。例如,latin1默認校對規(guī)則是latin1_swedish_ci。
·???????? 存在校對規(guī)則命名約定:它們以其相關的字符集名開始,通常包括一個語言名,并且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結束。
MySQL按照如下方法確定服務器字符集和服務器校對規(guī)則:
·???????? 當服務器啟動時根據有效的選項設置
·???????? 根據運行時的設定值
在服務器級別,確定方法很簡單。當啟動mysqld時,根據使用的初始選項設置來確定服務器字符集和 校對規(guī)則??梢允褂?/span>--default-character-set設置字符集,并且可以在字符集后面為 校對規(guī)則添加--default-collation。如果沒有指定一個字符集,那就與--default-character-set=latin1相同。如果你僅指定了一個字符集(例如,latin1),但是沒有指定一個 校對規(guī)則,那就與--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因為latin1_swedish_ci是latin1的默認校對規(guī)則。因此,以下三個命令有相同的效果:
shell> mysqld
shell> mysqld --default-character-set=latin1
shell> mysqld --default-character-set=latin1 \
?????????? --default-collation=latin1_swedish_ci
更改設定值的一個方法是通過重新編譯。如果希望在從源程序構建時更改默認服務器字符集和校對規(guī)則,使用:--with-charset和--with-collation作為configure的參量。例如:
shell> ./configure --with-charset=latin1
或者:
shell> ./configure --with-charset=latin1 \
?????????? --with-collation=latin1_german1_ci
mysqld和configure都驗證字符集/校對規(guī)則組合是否有效。如果無效,每個程序都顯示一個錯誤信息,然后終止。
當前的服務器字符集和校對規(guī)則可以用作character_set_server和collation_server系統(tǒng)變量的值。在運行時能夠改變這些變量的值。
CREATE DATABASE db_name
??? [[DEFAULT] CHARACTER SET charset_name]
??? [[DEFAULT] COLLATE collation_name]
?
ALTER DATABASE db_name
??? [[DEFAULT] CHARACTER SET charset_name]
??? [[DEFAULT] COLLATE collation_name]
例如:
CREATE DATABASE db_name
??? DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
MySQL這樣選擇數據庫字符集和數據庫校對規(guī)則:
·???????? 如果指定了CHARACTER SET X和COLLATE Y,那么采用字符集X和校對規(guī)則Y。
·???????? 如果指定了CHARACTER SET X而沒有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默認校對規(guī)則。
·???????? 否則,采用服務器字符集和服務器校對規(guī)則。
MySQL的CREATE DATABASE ... DEFAULT CHARACTER SET ...語法與標準SQL的CREATE SCHEMA ... CHARACTER SET ...語法類似。因此,可以在同一個MySQL服務器上創(chuàng)建使用不同字符集和 校對規(guī)則的數據庫。
如果在CREATE TABLE語句中沒有指定表字符集和校對規(guī)則,則使用數據庫字符集和校對規(guī)則作為默認值。它們沒有其它目的。
默認數據庫的字符集和校對規(guī)則可以用作character_set_database和 collation_database系統(tǒng)變量。無論何時默認數據庫更改了,服務器都設置這兩個變量的值。如果沒有 默認數據庫,這兩個變量與相應的服務器級別的變量(character_set_server和collation_server)具有相同的值。
CREATE TABLE tbl_name (column_list)
??? [DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
?
ALTER TABLE tbl_name
??? [DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]
例如:
CREATE TABLE t1 ( ... )
DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
MySQL按照下面的方式選擇表字符集和 校對規(guī)則:
·???????? 如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。
·???????? 如果指定了CHARACTER SET X而沒有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默認校對規(guī)則。
·???????? 否則,采用服務器字符集和服務器校對規(guī)則。
如果在列定義中沒有指定列字符集和校對規(guī)則,則默認使用表字符集和校對規(guī)則。表字符集和校對規(guī)則是MySQL的擴展;在標準SQL中沒有。
col_name {CHAR | VARCHAR | TEXT} (col_length)
??? [CHARACTER SET charset_name [COLLATE collation_name]]
例如:
CREATE TABLE Table1
(
??? column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);
MySQL按照下面的方式選擇列字符集和校對規(guī)則:
·???????? 如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。
·???????? 如果指定了CHARACTER SET X而沒有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默認校對規(guī)則。
·???????? 否則,采用表字符集和服務器校對規(guī)則。
CHARACTER SET和COLLATE子句是標準的SQL。
以下例子顯示了MySQL怎樣確定默認字符集和校對規(guī)則。
示例1:表和列定義
CREATE TABLE t1
(
??? c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci
) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin;
在這里我們有一個列使用latin1字符集和latin1_german1_ci校對規(guī)則。是顯式的定義,因此簡單明了。需要注意的是,在一個latin2表中存儲一個latin1列不會存在問題。
示例2:表和列定義
CREATE TABLE t1
(
??? c1 CHAR(10) CHARACTER SET latin1
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
這次我們有一個列使用latin1字符集和一個默認校對規(guī)則。盡管它顯得自然,默認校對規(guī)則卻不是表級。相反,因為latin1的默認校對規(guī)則總是latin1_swedish_ci,列c1有一個校對規(guī)則latin1_swedish_ci(而不是latin1_danish_ci)。
示例3:表和列定義
CREATE TABLE t1
(
??? c1 CHAR(10)
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
我們有一個列使用一個默認字符集和一個默認校對規(guī)則。在這種情況下,MySQL查找表級別來確定列字符集和 校對規(guī)則。因此,列c1的字符集是latin1,它的 校對規(guī)則是latin1_danish_ci。
示例4:數據庫、表和列定義
CREATE DATABASE d1
??? DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci;
USE d1;
CREATE TABLE t1
(
??? c1 CHAR(10)
);
我們創(chuàng)建了一個沒有指定字符集和校對規(guī)則的列。我們也沒有指定表級字符集和校對規(guī)則。在這種情況下,MySQL查找數據庫級的相關設置。(數據庫的設置變?yōu)楸淼脑O置,其后變?yōu)榱械脑O置。)因此,列c1的字符集為是latin2,它的 校對規(guī)則是latin2_czech_ci。
·???????? 服務器字符集和校對規(guī)則可以用作character_set_server和collation_server變量的值。
·???????? 默認數據庫的字符集和校對規(guī)則可以用作character_set_database和collation_database變量的值。
在客戶端和服務器的連接處理中也涉及了字符集和校對規(guī)則變量。每一個客戶端有一個連接相關的字符集和校對規(guī)則變量。
考慮什么是一個“連接”:它是連接服務器時所作的事情??蛻舳税l(fā)送SQL語句,例如查詢,通過連接發(fā)送到服務器。服務器通過連接發(fā)送響應給客戶端,例如結果集。對于客戶端連接,這樣會導致一些關于連接的字符集和 校對規(guī)則的問題,這些問題均能夠通過系統(tǒng)變量來解決:
·???????? 當查詢離開客戶端后,在查詢中使用哪種字符集?
服務器使用character_set_client變量作為客戶端發(fā)送的查詢中使用的字符集。
·???????? 服務器接收到查詢后應該轉換為哪種字符集?
轉換時,服務器使用character_set_connection和collation_connection系統(tǒng)變量。它將客戶端發(fā)送的查詢從character_set_client系統(tǒng)變量轉換到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介詞)。collation_connection對比較文字字符串是重要的。對于列值的字符串比較,它不重要,因為列具有更高的 校對規(guī)則優(yōu)先級。
·???????? 服務器發(fā)送結果集或返回錯誤信息到客戶端之前應該轉換為哪種字符集?
character_set_results變量指示服務器返回查詢結果到客戶端使用的字符集。包括結果數據,例如列值和結果元數據(如列名)。
你能夠調整這些變量的設置,或可以依賴默認值(這樣,你可以跳過本章)。
有兩個語句影響連接字符集:
SET NAMES 'charset_name'
SET CHARACTER SET charset_name
SET NAMES顯示客戶端發(fā)送的SQL語句中使用什么字符集。因此,SET NAMES 'cp1251'語句告訴服務器“將來從這個客戶端傳來的信息采用字符集cp1251”。它還為服務器發(fā)送回客戶端的結果指定了字符集。(例如,如果你使用一個SELECT語句,它表示列值使用了什么字符集。)
SET NAMES 'x'語句與這三個語句等價:
mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET character_set_connection = x;
將x設置為character_set_connection也就設置了collation_connection是x的默認校對規(guī)則。
SET CHARACTER SET語句是類似的,但是為 默認數據庫設置連接字符集和校對規(guī)則。SET CHARACTER SET x語句與這三個語句等價:
mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET collation_connection = @@collation_database;
當一個客戶端連接時,它向服務器發(fā)送希望使用的字符集名稱。服務器為那個字符集設置character_set_client、character_set_results和 character_set_connection變量。(實際上,服務器為使用該字符集執(zhí)行一個SET NAMES操作。)
對于mysql客戶端,如果你希望使用與默認字符集不同的字符集,不需要每次啟動時執(zhí)行SET NAMES語句??梢栽?strong>mysql語句行中或者選項文件中添加一個--default-character-set選項設置。例如,你每次運行mysql時,以下的選項文件設置把三個字符集變量修改為koi8r:
[mysql]
default-character-set=koi8r
例如:假設column1定義為CHAR(5) CHARACTER SET latin2。如果沒有設定SET NAMES或SET CHARACTER SET,那么對于SELECT column1 FROM t,當連接后,服務器使用客戶端指定的字符集返回列column1的所有值。另一方面,如果你設定SET NAMES 'latin1'或SET CHARACTER SET latin1,那么發(fā)送結果之前,服務器轉換latin2值到latin1。轉換可能會丟失那些不屬于兩種字符集的字符。
如果不希望服務器執(zhí)行任何轉換,設置character_set_results為NULL:
mysql> SET character_set_results = NULL;
一個字符串文字可能有一個可選的字符集引介詞和COLLATE子句:
[_charset_name]'string' [COLLATE collation_name]
例如:
SELECT 'string';
SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;
對于簡單的語句SELECT 'string',字符串使用由character_set_connection和collation_connection系統(tǒng)變量定義的字符集和 校對規(guī)則。
_charset_name表達式正式稱做一個引介詞。它告訴解析程序,“后面將要出現(xiàn)的字符串使用字符集X。”因為以前人們對此感到困惑,我們強調引介詞不導致任何轉換; 它僅是一個符號,不改變字符串的值。引介詞在標準十六進制字母和數字十六進制符號(x'literal'和 0xnnnn)中是合法的,以及?(當在一個編程語言接口中使用預處理的語句時進行參數替換)。
例如:
SELECT _latin1 x'AABBCC';
SELECT _latin1 0xAABBCC;
SELECT _latin1 ?;
MySQL這樣確定一個文字字符集和校對規(guī)則:
·???????? 如果指定了CHARACTER SET X和COLLATE Y,那么使用CHARACTER SET X和COLLATE Y。
·???????? 如果指定了CHARACTER SET X而沒有指定COLLATE Y,那么使用CHARACTER SET X和CHARACTER SET X的默認校對規(guī)則。
·???????? 否則,使用通過character_set_connection 和 collation_connection系統(tǒng)變量給出的字符集和 校對規(guī)則。
例如:
·???????? 使用latin1字符集和latin1_german1_ci校對規(guī)則的字符串:
·??????????????? SELECT _latin1'Müller' COLLATE latin1_german1_ci;
·???????? 使用latin1字符集和其默認校對規(guī)則的字符串(即,latin1_swedish_ci):
·??????????????? SELECT _latin1'Müller';
·???????? 使用連接默認字符集和校對規(guī)則的字符串:
·??????????????? SELECT 'Müller';
字符集引介詞和COLLATE子句是根據標準SQL規(guī)范實現(xiàn)的。
·???????? 使用ORDER BY:
·??????????????? SELECT k
·??????????????? FROM t1
·??????????????? ORDER BY k COLLATE latin1_german2_ci;
·???????? 使用AS:
·??????????????? SELECT k COLLATE latin1_german2_ci AS k1
·??????????????? FROM t1
·??????????????? ORDER BY k1;
·???????? 使用GROUP BY:
·??????????????? SELECT k
·??????????????? FROM t1
·??????????????? GROUP BY k COLLATE latin1_german2_ci;
·???????? 使用聚合函數:
·??????????????? SELECT MAX(k COLLATE latin1_german2_ci)
·??????????????? FROM t1;
·???????? 使用DISTINCT:
·??????????????? SELECT DISTINCT k COLLATE latin1_german2_ci
·??????????????? FROM t1;
·???????? 使用WHERE:
·??????????????? ?????SELECT *
·??????????????? ?????FROM t1
·??????????????? ?????WHERE _latin1 'Müller' COLLATE latin1_german2_ci = k;
·??????????????? ?????SELECT *
·??????????????? ?????FROM t1
·??????????????? ?????WHERE k LIKE _latin1 'Müller' COLLATE latin1_german2_ci;
·???????? 使用HAVING:
·??????????????? SELECT k
·??????????????? FROM t1
·??????????????? GROUP BY k
·??????????????? HAVING k = _latin1 'Müller' COLLATE latin1_german2_ci;
COLLATE子句有較高的優(yōu)先級(高于||),因此下面兩個表達式是等價的:
x || y COLLATE z
x || (y COLLATE z)
在絕大多數查詢中,MySQL使用哪種校對規(guī)則進行比較是很顯然的。例如,在下列情況中,校對規(guī)則明顯的是“列x的列校對規(guī)則”:
SELECT x FROM T ORDER BY x;
SELECT x FROM T WHERE x = x;
SELECT DISTINCT x FROM T;
但是,當涉及多個操作數時,可能不明確。例如:
SELECT x FROM T WHERE x = 'Y';
這個查詢應該使用列x的 校對規(guī)則,還是字符串文字'Y'的 校對規(guī)則?
標準化SQL使用“可壓縮性”規(guī)則解決這種問題?;旧?,這個意思是:既然x和'Y'都有 校對規(guī)則,哪個校對規(guī)則優(yōu)先?這可能比較難解決,但是以下規(guī)則適合大多數情況:
·???????? 一個外在的COLLATE子句可壓縮性是0(根本不能壓縮。)
·???????? 使用不同校對規(guī)則的兩個字符串連接的可壓縮性是1。
·???????? 列校對規(guī)則的可壓縮性是2。
·???????? “系統(tǒng)常數”(如USER()或VERSION()函數返回的字符串)可壓縮性是3。
·???????? 文字規(guī)則的可壓縮性是4。
·???????? NULL或從NULL派生的表達式的可壓縮性是 5。
上述可壓縮性值是MySQL5.1當前所用的。
這樣上述規(guī)則可以模糊解決:
·???????? 使用最低的可壓縮性值的校對規(guī)則。
·???????? 如果兩側有相同的可壓縮性,那么如果校對規(guī)則不同則發(fā)生錯誤。
例如:
column1 = 'A' |
使用column1的校對規(guī)則 |
column1 = 'A' COLLATE x |
使用'A'的校對規(guī)則 |
column1 COLLATE x = 'A' COLLATE y |
錯誤 |
使用COERCIBILITY()函數確定一個字符串表達式的可壓縮性:
mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
??????? -> 0
mysql> SELECT COERCIBILITY(VERSION());
??????? -> 3
mysql> SELECT COERCIBILITY('A');
??????? -> 4
見12.9.3節(jié),“信息函數”。
沒有系統(tǒng)常數或可忽略的壓縮性。函數如USER()的可壓縮性是2而不是3,文字的可壓縮性是3而不是4。
請注意每個字符集有一個或多個校對規(guī)則,并且每個校對規(guī)則只能屬于一個字符集。因此,以下語句會產生一個錯誤信息,因為校對規(guī)則latin2_bin對于字符集latin1非法:
mysql> SELECT _latin1 'x' COLLATE latin2_bin;
ERROR 1251: COLLATION 'latin2_bin' is not valid
for CHARACTER SET 'latin1'
假設表T中的列X有這些latin1列值:
Muffler
Müller
MX Systems
MySQL
假設使用下面的語句獲取列值:
SELECT X FROM T ORDER BY X COLLATE collation_name;
使用不同校對規(guī)則的列值結果排序見下表:
latin1_swedish_ci |
latin1_german1_ci |
latin1_german2_ci |
Muffler |
Muffler |
Müller |
MX系統(tǒng) |
Müller |
Muffler |
Müller |
MX系統(tǒng) |
MX系統(tǒng) |
MySQL |
MySQL |
MySQL |
本表顯示了我們在ORDER BY字句中使用不同所校對規(guī)則的效果的示例。在本例中導致不同排序的字符是上面帶有兩個圓點的U(ü),它在德語中發(fā)音為"U-umlaut"。
·???????? 第一列顯示的是使用瑞典/芬蘭校對規(guī)則的SELECT語句的結果,它被稱作U-umlaut使用Y排序。
·???????? 第二列顯示的是使用德語DIN-1校對規(guī)則的SELECT語句的結果,它被稱作U-umlaut使用U排序。
·???????? 第三列顯示的是使用德語DIN-2校對規(guī)則的SELECT語句的結果,它被稱作U-umlaut使用UE排序。
對于簡單的函數,即接收字符串輸入然后返回一個字符串結果作為輸出的函數,輸出的字符集和校對規(guī)則與原始輸入的相同。例如,UPPER(X)返回一個字符串,其字符和 校對規(guī)則與X相同。類似的函數還有INSTR()、LCASE()、LOWER()、LTRIM()、MID()、REPEAT()、REPLACE()、REVERSE()、RIGHT()、RPAD()、RTRIM()、SOUNDEX()、SUBSTRING()、TRIM()、UCASE()和UPPER()。(還需要注意:REPLACE()函數不同于其它函數,它總是忽略輸入字符串的 校對規(guī)則,并且進行大小寫不敏感的比較。)
對于合并多個字符串輸入并且返回單個字符串輸出的運算,應用標準SQL“聚合規(guī)則”:
·???????? 如果存在顯式的校對規(guī)則X,那么使用X。
·???????? 如果存在顯式的校對規(guī)則X和Y,那么產生一個錯誤。
·???????? 否則,如果全部校對規(guī)則是X,那么使用X。
·???????? 其它情況,結果沒有校對規(guī)則。
例如,使用CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END。結果校對規(guī)則是X。對于CASE、UNION、||、CONCAT()、ELT()、GREATEST()、IF()和LEAST()情況相同。
對于轉換為字符數據的運算,從運算得到的結果字符串的字符集和校對規(guī)則由character_set_connection和collation_connection系統(tǒng)變量定義。這適用于CAST()、CHAR()、CONV()、FORMAT()、HEX()和SPACE()函數。
CONVERT(expr USING transcoding_name)
在 MySQL中,轉換代碼名與相應的字符集名相同。
例子:
SELECT CONVERT(_latin1'Müller' USING utf8);
INSERT INTO utf8table (utf8column)
??? SELECT CONVERT(latin1field USING utf8) FROM latin1table;
CONVERT(... USING ...)根據標準SQL規(guī)范實施。
在傳統(tǒng)SQL模式中,如果你轉換一個“0”日期字符串到日期類型,CONVERT()函數返回NULL。在MySQL5.1中還產生一條警告。
CAST(character_string AS character_data_type CHARACTER SET charset_name)
例如:
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);
如果使用CAST()時沒有指定CHARACTER SET,結果字符集和校對規(guī)則通過character_set_connection 和 collation_connection系統(tǒng)變量定義。如果用CAST()并帶有CHARACTER SET X選項,那么結果字符集和校對規(guī)則是X和其 默認的校對規(guī)則。
你可能不能在CAST()中使用COLLATE子句,但是你可以在外部使用它。也就是說,不是CAST(... COLLATE ...),而是CAST(...) COLLATE ...。
例如:
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
在傳統(tǒng)SQL模式中,如果你轉換一個“0”日期字符串到日期類型,CAST()函數返回NULL。在MySQL5.1中還產生一條警告。
一些SHOW語句提供額外的字符集信息。這些語句包括SHOW CHARACTER SET、SHOW COLLATION、SHOW CREATE DATABASE、SHOW CREATE TABLE和SHOW COLUMNS。
SHOW CHARACTER SET命令顯示全部可用的字符集。它帶有一個可選的LIKE子句來指示匹配哪些字符集名。例如:
mysql> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description???????????????? | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| latin1? | cp1252 West European??????? | latin1_swedish_ci |????? 1 |
| latin2? | ISO 8859-2 Central European | latin2_general_ci |????? 1 |
| latin5? | ISO 8859-9 Turkish????????? | latin5_turkish_ci |????? 1 |
| latin7? | ISO 8859-13 Baltic????????? | latin7_general_ci |????? 1 |
+---------+-----------------------------+-------------------+--------+
見13.5.4.1節(jié),“SHOW CHARACTER SET語法”。
SHOW COLLATION語句的輸出包括全部可用的字符集。它帶有一個可選的LIKE子句來指示匹配哪些 校對規(guī)則名。例如:
mysql> SHOW COLLATION LIKE 'latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation???????? | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1? |? 5 |???????? |????????? |?????? 0 |
| latin1_swedish_ci | latin1? |? 8 | Yes???? | Yes????? |?????? 0 |
| latin1_danish_ci? | latin1? | 15 |???????? |????? ????|?????? 0 |
| latin1_german2_ci | latin1? | 31 |???????? | Yes????? |?????? 2 |
| latin1_bin??????? | latin1? | 47 |???????? | Yes????? |?????? 0 |
| latin1_general_ci | latin1? | 48 |???????? |????????? |?????? 0 |
| latin1_general_cs | latin1? | 49 |???????? |????????? |?????? 0 |
| latin1_spanish_ci | latin1? | 94 |???????? |????????? |?????? 0 |
+-------------------+---------+----+---------+----------+---------+
見13.5.4.2節(jié),“SHOW COLLATION語法”。
SHOW CREATE DATABASE語句顯示創(chuàng)建給定數據庫的CREATE DATABASE語句。結果包括全部數據庫選項。支持DEFAULT CHARACTER SET和COLLATE。全部數據庫選項存儲在命名為db.Opt的文本文件中,該文件能夠在數據庫目錄中找到。
mysql> SHOW CREATE DATABASE test;
+----------+-----------------------------------------------------------------+
| Database | Create Database???????????????????????????????????????????????? |
+----------+-----------------------------------------------------------------+
| test???? | CREATE DATABASE `test` |
+----------+-----------------------------------------------------------------+
見13.5.4.4節(jié),“SHOW CREATE DATABASE語法”
SHOW CREATE TABLE與SHOW CREATE DATABASE相似,但是顯示創(chuàng)建給定數據庫的CREATE TABLE語句。列定義顯示任何字符集規(guī)格,并且表選項包括字符集信息。
見13.5.4.5節(jié),“SHOW CREATE TABLE語法”
當以SHOW FULL COLUMNS調用時,SHOW COLUMNS語句顯示表中列的校對規(guī)則。具有CHAR、VARCHAR或TEXT數據類型的列有非NULL的 校對規(guī)則。數值列和其它非字符類型的列有NULL校對規(guī)則。例如:
mysql> SHOW FULL COLUMNS FROM person\G
*************************** 1. row ***************************
???? Field: id
????? Type: smallint(5) unsigned
?Collation: NULL
????? Null: NO
?????? Key: PRI
?? Default: NULL
???? Extra: auto_increment
Privileges: select,insert,update,references
?? Comment:
*************************** 2. row ***************************
???? Field: name
????? Type: char(60)
?Collation: latin1_swedish_ci
????? Null: NO
?????? Key:
?? Default:
???? Extra:
Privileges: select,insert,update,references
?? Comment:
字符集不是顯示的部分。(字符集名隱含在校對規(guī)則名中。)
見13.5.4.3節(jié),“SHOW COLUMNS語法”。
MySQL 5.1支持兩種字符集以保存Unicode數據:
·???????? ucs2,UCS-2 Unicode字符集。
·???????? utf8,Unicode字符集的UTF8編碼。
在UCS-2(二進制Unicode表示法)中,每一個字符用一個雙字節(jié)的Unicode編碼來表示的,第一個字節(jié)表示重要的意義。例如:"LATIN CAPITAL LETTER A"的Unicode編碼是0x0041,它按順序存儲為兩個字節(jié):0x00 0x41。"CYRILLIC SMALL LETTER YERU"(Unicode 0x044B)順序存儲為兩個字節(jié):0x04 0x4B。對于Unicode字符和它們的編碼,請參見Unicode 主頁 。
當前,UCS-2還不能夠用作為客戶端字符集,這意味著SET NAMES 'ucs2'不起作用。
UTF8字符集(轉換Unicode表示)是存儲Unicode數據的一種可選方法。它根據 RFC 3629執(zhí)行。UTF8字符集的思想是不同Unicode字符采用變長字節(jié)序列編碼:
·???????? 基本拉丁字母、數字和標點符號使用一個字節(jié)。
·???????? 大多數的歐洲和中東手寫字母適合兩個字節(jié)序列:擴展的拉丁字母(包括發(fā)音符號、長音符號、重音符號、低音符號和其它音符)、西里爾字母、希臘語、亞美尼亞語、希伯來語、阿拉伯語、敘利亞語和其它語言。
·???????? 韓語、中文和日本象形文字使用三個字節(jié)序列。
RFC 3629說明了采用一到四個字節(jié)的編碼序列。當前,MySQLUTF8不支持四個字節(jié)。(UTF8編碼的舊標準是由RFC 2279給出,它描述了從一到六個字節(jié)的UTF8編碼序列。RFC 3629補充了作廢的RFC 2279;因此,不再使用5個字節(jié)和6個字節(jié)的編碼序列。)
提示:使用UTF8時為了節(jié)省空間,使用VARCHAR而不要用CHAR。否則,MySQL必須為一個CHAR(10) CHARACTER SET utf8列預備30個字節(jié),因為這是可能的最大長度。
元數據是“關于數據的數據”。描述數據庫的任何數據—作為數據庫內容的對立面—是元數據。因此,列名、數據庫名、用戶名、版本名以及從SHOW語句得到的結果中的大部分字符串是元數據。還包括INFORMATION_SCHEMA數據庫中的表中的內容,因為定義的那些表存儲關于數據庫對象的信息。
元數據表述必須滿足這些需求:
·???????? 全部元數據必須在同一字符集內。否則,對INFORM一個TION_SCHEMA數據庫中的表執(zhí)行的SHOW命令和SELECT查詢不能正常工作,因為這些運算結果中的同一列的不同行將會使用不同的字符集。
·???????? 元數據必須包括所有語言的所有字符。否則,用戶將不能夠使用它們自己的語言來命名列和表。
為了滿足這兩個需求,MySQL使用Unicode字符集存儲元數據,即UTF8。如果你從不使用重音字符,這不會導致任何破壞。但如果你使用重音字符,應該注意的是元數據是用UTF8存儲。
這意味著,USER()、CURRENT_USER()、DATABASE()和VERSION()函數的返回值被 默認設置為UTF8字符集,這與同義函數如SESSION_USER() 和SYSTEM_USER()的結果相同。
服務器將character_set_system系統(tǒng)變量設置為元數據字符集的名:
mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+-------+
| Variable_name??????? | Value |
+----------------------+-------+
| character_set_system | utf8? |
+----------------------+-------+
存儲元數據使用Unicode并不意味著列頭和DESCRIBE函數的結果默認在character_set_system字符集中。當你使用SELECT column1 FROM t語句時,名字為column1的列從服務器返回客戶端并使用由SET NAMES語句確定的字符集。更明確地說,使用的字符集是由character_set_results系統(tǒng)變量的值確定的。如果這個系統(tǒng)變量設置為NULL,不執(zhí)行字符轉換,服務器使用最初的字符集(字符集由character_set_system系統(tǒng)變量設置)返回元數據。
如果你希望服務器不使用UTF8字符集返回元數據結果,那么使用SET NAMES語句強制服務器執(zhí)行字符集轉換(見10.3.6節(jié),“連接字符集和校對”),或者在客戶端執(zhí)行轉換。在客戶端執(zhí)行轉換效率較高,但這種選項并不能使用于全部客戶端。
如果你正在一個語句中使用(例如)USER()函數進行比較或賦值,不要擔心。MySQL為你執(zhí)行一些原子轉換。
SELECT * FROM Table1 WHERE USER() = latin1_column;
這是可以的,因為在比較之前latin1_column列的內容會自動轉換到UTF8。
INSERT INTO Table1 (latin1_column) SELECT USER();
這是可以的,因為賦值之前USER()函數返回的內容自動轉換為latin1。至今,自動轉換沒有全部實施,但是以后的版本中應該工作正常。
盡管自動轉換不屬于SQL標準,SQL標準化文檔中說每一個字符集是(根據支持的字符)Unicode的“子集”。因此,一個知名的原則是,“適用超集的字符集能夠應用于其子集”,我們相信Unicode的 校對規(guī)則能夠應用于非Unicode字符串的比較。
注釋:在MySQL5.1中,errmsg.txt文件全部使用UTF8??蛻舳俗址霓D換是自動進行的,如同元數據。
對于MaxDB兼容性,下面兩個語句是相同的:
CREATE TABLE t1 (f1 CHAR(n) UNICODE); CREATE TABLE t1 (f1 CHAR(n) CHARACTER SET ucs2);
CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)
下面同樣:
VARCHAR(10) CHARACTER SET utf8
NATIONAL VARCHAR(10)
NCHAR VARCHAR(10)
NATIONAL CHARACTER VARYING(10)
NATIONAL CHAR VARYING(10)
你能夠使用N'literal'來創(chuàng)建一個使用國家特有字符集的字符串。這兩個語句是等價的:
SELECT N'some text';
SELECT _utf8'some text';
關于MySQL從4.1以前的版本到5.1版本字符集升級的信息,請參見MySQL4.1參考手冊。
MySQL支持30多種字符集的70多種 校對規(guī)則。字符集和它們的默認校對規(guī)則可以通過SHOW CHARACTER SET語句顯示:
mysql> SHOW CHARACTER SET; +----------+-----------------------------+---------------------+ | Charset | Description | Default collation | +----------+-----------------------------+---------------------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | | dec8 | DEC West European | dec8_swedish_ci | | cp850 | DOS West European | cp850_general_ci | | hp8 | HP West European | hp8_english_ci | | koi8r | KOI8-R Relcom Russian | koi8r_general_ci | | latin1 | cp1252 West European | latin1_swedish_ci | | latin2 | ISO 8859-2 Central European | latin2_general_ci | | swe7 | 7bit Swedish | swe7_swedish_ci | | ascii | US ASCII | ascii_general_ci | | ujis | EUC-JP Japanese | ujis_japanese_ci | | sjis | Shift-JIS Japanese | sjis_japanese_ci | | hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | | tis620 | TIS620 Thai | tis620_thai_ci | | euckr | EUC-KR Korean | euckr_korean_ci | | koi8u | KOI8-U Ukrainian | koi8u_general_ci | | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | | greek | ISO 8859-7 Greek | greek_general_ci | | cp1250 | Windows Central European | cp1250_general_ci | | gbk | GBK Simplified Chinese | gbk_chinese_ci | | latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | | armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | | utf8 | UTF-8 Unicode | utf8_general_ci | | ucs2 | UCS-2 Unicode | ucs2_general_ci | | cp866 | DOS Russian | cp866_general_ci | | keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | | macce | Mac Central European | macce_general_ci | | macroman | Mac West European | macroman_general_ci | | cp852 | DOS Central European | cp852_general_ci | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | | cp1251 | Windows Cyrillic | cp1251_general_ci | | cp1256 | Windows Arabic | cp1256_general_ci | | cp1257 | Windows Baltic | cp1257_general_ci | | binary | Binary pseudo charset | binary | | geostd8 | GEOSTD8 Georgian | geostd8_general_ci | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | +----------+-----------------------------+---------------------+
MySQL有兩種Unicode字符集。你能夠使用這些字符集保存大約650種語言的文本。
·???????? ucs2 (UCS-2 Unicode)校對規(guī)則:
mysql> SHOW COLLATION LIKE 'ucs2%'; +--------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------+---------+-----+---------+----------+---------+ | ucs2_general_ci | ucs2 | 35 | Yes | Yes | 1 | | ucs2_bin | ucs2 | 90 | | Yes | 1 | | ucs2_unicode_ci | ucs2 | 128 | | Yes | 8 | | ucs2_icelandic_ci | ucs2 | 129 | | Yes | 8 | | ucs2_latvian_ci | ucs2 | 130 | | Yes | 8 | | ucs2_romanian_ci | ucs2 | 131 | | Yes | 8 | | ucs2_slovenian_ci | ucs2 | 132 | | Yes | 8 | | ucs2_polish_ci | ucs2 | 133 | | Yes | 8 | | ucs2_estonian_ci | ucs2 | 134 | | Yes | 8 | | ucs2_spanish_ci | ucs2 | 135 | | Yes | 8 | | ucs2_swedish_ci | ucs2 | 136 | | Yes | 8 | | ucs2_turkish_ci | ucs2 | 137 | | Yes | 8 | | ucs2_czech_ci | ucs2 | 138 | | Yes | 8 | | ucs2_danish_ci | ucs2 | 139 | | Yes | 8 | | ucs2_lithuanian_ci | ucs2 | 140 | | Yes | 8 | | ucs2_slovak_ci | ucs2 | 141 | | Yes | 8 | | ucs2_spanish2_ci | ucs2 | 142 | | Yes | 8 | | ucs2_roman_ci | ucs2 | 143 | | Yes | 8 | | ucs2_persian_ci | ucs2 | 144 | | Yes | 8 | | ucs2_esperanto_ci | ucs2 | 145 | | Yes | 8 | +--------------------+---------+-----+---------+----------+---------+
utf8 (UTF-8 Unicode)校對規(guī)則:
mysql> SHOW COLLATION LIKE 'utf8%'; +--------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------+---------+-----+---------+----------+---------+ | utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | | utf8_bin | utf8 | 83 | | Yes | 1 | | utf8_unicode_ci | utf8 | 192 | | Yes | 8 | | utf8_icelandic_ci | utf8 | 193 | | Yes | 8 | | utf8_latvian_ci | utf8 | 194 | | Yes | 8 | | utf8_romanian_ci | utf8 | 195 | | Yes | 8 | | utf8_slovenian_ci | utf8 | 196 | | Yes | 8 | | utf8_polish_ci | utf8 | 197 | | Yes | 8 | | utf8_estonian_ci | utf8 | 198 | | Yes | 8 | | utf8_spanish_ci | utf8 | 199 | | Yes | 8 | | utf8_swedish_ci | utf8 | 200 | | Yes | 8 | | utf8_turkish_ci | utf8 | 201 | | Yes | 8 | | utf8_czech_ci | utf8 | 202 | | Yes | 8 | | utf8_danish_ci | utf8 | 203 | | Yes | 8 | | utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 | | utf8_slovak_ci | utf8 | 205 | | Yes | 8 | | utf8_spanish2_ci | utf8 | 206 | | Yes | 8 | | utf8_roman_ci | utf8 | 207 | | Yes | 8 | | utf8_persian_ci | utf8 | 208 | | Yes | 8 | | utf8_esperanto_ci | utf8 | 209 | | Yes | 8 | +--------------------+---------+-----+---------+----------+---------+
utf8_unicode_ci校對規(guī)則是根據Unicode校對規(guī)則算法(UCA)執(zhí)行的, 校對規(guī)則描述見 http://www.unicode.org/reports/tr10/。此校對規(guī)則使用UCA 4.0.0版本砝碼鍵:http://www.unicode.org/Public/UC一個/4.0.0/一個llkeys-4.0.0.txt。(以下討論使用utf8_unicode_ci,但同樣適合ucs2_unicode_ci。)
當前,utf8_unicode_ci校對規(guī)則僅部分支持Unicode校對規(guī)則算法。一些字符還是不能支持。并且,不能完全支持組合的記號。這主要影響越南和俄羅斯的一些少數民族語言,如:Udmurt 、Tatar、Bashkir和Mari。
utf8_unicode_ci的最主要的特色是支持擴展,即當把一個字母看作與其它字母組合相等時。例如,在德語和一些其它語言中‘?’等于‘ss’。
utf8_general_ci是一個遺留的 校對規(guī)則,不支持擴展。它僅能夠在字符之間進行逐個比較。這意味著utf8_general_ci校對規(guī)則進行的比較速度很快,但是與使用utf8_unicode_ci的 校對規(guī)則相比,比較正確性較差)。
例如,使用utf8_general_ci和utf8_unicode_ci兩種 校對規(guī)則下面的比較相等:
? = A
? = O
ü = U
兩種校對規(guī)則之間的區(qū)別是,對于utf8_general_ci下面的等式成立:
? = s
但是,對于utf8_unicode_ci下面等式成立:
? = ss
對于一種語言僅當使用utf8_unicode_ci排序做的不好時,才執(zhí)行與具體語言相關的utf8字符集 校對規(guī)則。例如,對于德語和法語,utf8_unicode_ci工作的很好,因此不再需要為這兩種語言創(chuàng)建特殊的utf8校對規(guī)則。
utf8_general_ci也適用與德語和法語,除了‘?’等于‘s’,而不是‘ss’之外。如果你的應用能夠接受這些,那么應該使用utf8_general_ci,因為它速度快。否則,使用utf8_unicode_ci,因為它比較準確。
utf8_swedish_ci,與其它語言相關的utf8的校對規(guī)則相似,來源于utf8_unicode_ci,使用額外的語言規(guī)則。例如,在瑞典語中,以下的關系式成立,它在德語和法語中不成立:
ü = Y < ?
utf8_spanish_ci和utf8_spanish2_ci校對規(guī)則分別適用于現(xiàn)代和古典西班牙語。在兩種 校對規(guī)則中,?’(n-發(fā)音符)是‘n’和‘o’之間的間隔字母。另外,對于古典西班牙語,‘ch’是‘c’和d之間的間隔字母,并且‘ll’是‘l’和‘m’之間的間隔字母。
西歐字符集覆蓋大多數西歐語言,如法語、西班牙語、加泰羅尼亞語、巴斯克人語、葡萄牙語、意大利語、阿而巴尼亞語、荷蘭語、德語、丹麥語、瑞典語、挪威語、芬蘭語、法羅人語、冰島語、愛爾蘭語、蘇格蘭語和英語。
·???????? ascii(US ASCII)校對規(guī)則:
o??????? ascii_bin
o??????? ascii_general_ci( 默認)
·???????? cp850(DOS西歐) 校對規(guī)則:
o??????? cp850_bin
o??????? cp850_general_ci( 默認)
·???????? dec8(DEC 西歐)校對規(guī)則:
o??????? dec8_bin
o??????? dec8_swedish_ci( 默認)
·???????? hp8(HP 西歐)校對規(guī)則:
o??????? hp8_bin
o??????? hp8_english_ci( 默認)
·???????? latin1(cp1252 西歐)校對規(guī)則:
o??????? latin1_bin
o??????? latin1_danish_ci
o??????? latin1_general_ci
o??????? latin1_general_cs
o??????? latin1_german1_ci
o??????? latin1_german2_ci
o??????? latin1_spanish_ci
o??????? latin1_swedish_ci( 默認)
latin1是 默認字符集。latin1_swedish_ci是 默認的校對規(guī)則,它用于大多數MySQL客戶。雖然經常說它以瑞典/芬蘭 校對規(guī)則為基礎,但瑞典和芬蘭人不同意這種說法。
latin1_german1_ci和latin1_german2_ci校對規(guī)則基于DIN-1和DIN-2標準,這里DIN代表Deutsches Institut für Normung(德語等價于ANSI)。DIN-1被叫做“字典校對規(guī)則”,DIN-2被叫做“電話簿校對規(guī)則”。
o??????? latin1_german1_ci(字典)規(guī)則:
o???????????????????? ? = a
o???????????????????? ? = O
o???????????????????? ü = U
o???????????????????? ? = s
o??????? latin1_german2_ci(電話簿)規(guī)則:
o???????????????????? ? = aE
o???????????????????? ? = OE
o???????????????????? ü = UE
o???????????????????? ? = ss
在 latin1_spanish_ci校對規(guī)則中,‘?’(n-tilde)是‘n’和‘o’之間的間隔字母。
·???????? macroma(Mac西歐) 校對規(guī)則:
o??????? macroman_bin
o??????? macroman_general_ci( 默認)
·???????? swe7(7位瑞典語) 校對規(guī)則:
o??????? swe7_bin
o??????? swe7_swedish_ci( 默認)
·???????? cp1250(Windows中歐) 校對規(guī)則:
o??????? cp1250_bin
o??????? cp1250_croatian_ci
o??????? cp1250_czech_cs
o??????? cp1250_general_ci( 默認)
·???????? cp852(DOS 中歐)校對規(guī)則:
o??????? cp852_bin
o??????? cp852_general_ci( 默認)
·???????? keybcs2(DOS Kamenicky Czech-Slovak)校對規(guī)則:
o??????? keybcs2_bin
o??????? keybcs2_general_ci( 默認)
·???????? latin2(ISO 8859-2 中歐)校對規(guī)則:
o??????? latin2_bin
o??????? latin2_croatian_ci
o??????? latin2_czech_cs
o??????? latin2_general_ci( 默認)
o??????? latin2_hungarian_ci
·???????? macce(Mac 中歐)校對規(guī)則:
o??????? macce_bin
o??????? macce_general_ci( 默認)
·???????? armscii8(ARMSCII-8 亞美尼亞語)校對規(guī)則:
o??????? armscii8_bin
o??????? armscii8_general_ci( 默認)
·???????? cp1256(阿拉伯語Windows) 校對規(guī)則:
o??????? cp1256_bin
o??????? cp1256_general_ci( 默認)
·???????? geostd8(GEOSTD8喬治亞語) 校對規(guī)則:
o??????? geostd8_bin
o??????? geostd8_general_ci( 默認)
·???????? greek(ISO 8859-7希臘語)校對規(guī)則:
o??????? greek_bin
o??????? greek_general_ci( 默認)
·???????? hebrew(ISO 8859-8希伯萊語)校對規(guī)則:
o??????? hebrew_bin
o??????? hebrew_general_ci( 默認)
·???????? latin5(ISO 8859-9 土耳其語)校對規(guī)則:
o??????? latin5_bin
o??????? latin5_turkish_ci( 默認)
·???????? cp1257(Windows波羅的海) 校對規(guī)則:
o??????? cp1257_bin
o??????? cp1257_general_ci( 默認)
o??????? cp1257_lithuanian_ci
·???????? latin7(ISO 8859-13波羅的海)校對規(guī)則:
o??????? latin7_bin
o??????? latin7_estonian_cs
o??????? latin7_general_ci( 默認)
o??????? latin7_general_cs
·???????? cp1251(Windows 西里爾)校對規(guī)則:
o??????? cp1251_bin
o??????? cp1251_bulgarian_ci
o??????? cp1251_general_ci( 默認)
o??????? cp1251_general_cs
o??????? cp1251_ukrainian_ci
·???????? cp866(DOS 俄語)校對規(guī)則:
o??????? cp866_bin
o??????? cp866_general_ci( 默認)
·???????? koi8r(KOI8-R Relcom 俄語)校對規(guī)則:
o??????? koi8r_bin
o??????? koi8r_general_ci( 默認)
·???????? koi8u(KOI8-U 烏克蘭語)校對規(guī)則:
o??????? koi8u_bin
o??????? koi8u_general_ci( 默認)
我們支持的亞洲字符集包括中文、日語、韓語和泰國語。這些可能比較復雜。例如,中文字符集必須考慮到上千種不同的字符。
·???????? big5(Big5傳統(tǒng)中文) 校對規(guī)則:
o??????? big5_bin
o??????? big5_chinese_ci( 默認)
·???????? cp932(SJIS Windows日語)校對規(guī)則:
o??????? cp932_bin
o??????? cp932_japanese_ci( 默認)
·???????? eucjpms(UJIS Windows日語)校對規(guī)則:
o??????? eucjpms_bin
o??????? eucjpms_japanese_ci( 默認)
·???????? euckr(EUC-KR 韓語)校對規(guī)則:
o??????? euckr_bin
o??????? euckr_korean_ci( 默認)
·???????? gb2312(GB2312 簡體中文)校對規(guī)則:
o??????? gb2312_bin
o??????? gb2312_chinese_ci( 默認)
·???????? gbk(GBK簡體中文) 校對規(guī)則:
o??????? gbk_bin
o??????? gbk_chinese_ci( 默認)
·???????? sjis(Shift-JIS 日語)校對規(guī)則:
o??????? sjis_bin
o??????? sjis_japanese_ci( 默認)
·???????? tis620(TIS620 泰國語)校對規(guī)則:
o??????? tis620_bin
o??????? tis620_thai_ci( 默認)
·???????? ujis(EUC-JP 日語)校對規(guī)則:
o??????? ujis_bin
o??????? ujis_japanese_ci( 默認)
為什么需要cp932?
在MySQL中,sjis字符集對應于由IANA定義的Shift_JIS字符集,它支持JIS X0201和JIS X0208字符。(見 http://www.iana.org/assignments/character-sets 。)
但是,“SHIFT JIS”作為描述性術語的含義變得非常含糊不清,并且它常常包括由不同供應商定義的Shift_JIS擴展部分。
例如,使用在日本Windows環(huán)境中使用的“SHIFT JIS”是Microsoft對Shift_JIS的Microsoft擴展,它的準確名字是Microsoft Windows Codepage: 932或cp932。除由Shift_JIS支持的字符之外,cp932支持擴展字符,如NEC選擇的IBM擴展字符和IBM擴展字符。
許多日本用戶在使用這些擴展字符過程中碰到過一些問題。這些問題是由于以下情況引起的:
·???????? MySQL自動轉換字符集。
·???????? 字符集通過Unicode轉換(ucs2)。
·???????? sjis字符集不支持這些擴展字符轉換。
·???????? 從號稱“SHIFT JIS”到Unicode的轉換,存在一些轉換規(guī)則,并且一些字符轉換到Unicode依賴不同的轉換規(guī)則。MySQL僅支持這些轉換規(guī)則中的一種(在后面描述)。
MySQLcp932字符集可以解決這些轉換問題。
因為MySQL支持字符集轉換,將IANA Shift_JIS 和 cp932分離為兩種不同字符集是重要的,因為它們提供不同的轉換規(guī)則。
cp932與sjis有什么不同?
cp932字符集與sjis存在以下不同點:
·???????? cp932支持NEC特殊字符、NEC選擇的IBM擴展字符和IBM選擇的字符。
·???????? 一些cp932字符有兩個不同的編碼點,這兩種編碼點轉換為相同Unicode編碼點。因此,當從Unicode轉換回到cp932時,必須選擇一個編碼點。對于這種“相互轉換”,使用由Microsoft推薦的轉換規(guī)則。(見 http://support.microsoft.com/kb/170559/EN-US/。)
轉換規(guī)則如下:
o??????? 如果字符在JIS X 0208 和NEC特殊字符中同時存在,使用JIS X 0208 的編碼點。
o??????? 如果字符在NEC特殊字符和IBM選擇的字符中同時存在,使用NEC特殊字符的編碼點。
o??????? 如果字符在IBM選擇的字符和NEC選擇的IBM擴展字符中同時存在,使用IBM擴展字符的編碼點。
關于cp932字符的Unicode 值的列表顯示信息見http://www.microsoft.com/globaldev/reference/dbcs/932.htm。對于cp932表中的帶有下面有四位數字出現(xiàn)的字符的實體,數字代表相應的Unicode(ucs2)編碼。對于表中有兩個帶下劃線的數字出現(xiàn)的實體,擇有一個以那兩個數字開頭的cp932字符值的范圍。點擊一個這種表的實體,將帶你到一個頁,該頁顯示每個以那些數字開頭的cp932字符的Unicode值。
以下連接很重要。它們與下列字符集的編碼相對應:
o??????? NEC特殊字符:
http://www.microsoft.com/globaldev/reference/dbcs/932/932_87.htm
o??????? NEC選擇的IBM擴展字符:
o???????????????????? http://www.microsoft.com/globaldev/reference/dbcs/932/932_ED.htm
o???????????????????? http://www.microsoft.com/globaldev/reference/dbcs/932/932_EE.htm
o??????? IBM選擇的字符:
o???????????????????? http://www.microsoft.com/globaldev/reference/dbcs/932/932_FA.htm
o???????????????????? http://www.microsoft.com/globaldev/reference/dbcs/932/932_FB.htm
o???????????????????? http://www.microsoft.com/globaldev/reference/dbcs/932/932_FC.htm
·???????? cp932與eucjpms結合支持用戶自定義字符的轉換,并且解決sjis/ujis轉換問題。詳細信息,請參見http://www.opengroup.or.jp/jvc/cde/sjis-euc-e.html。
·???????? 對于一些字符,與ucs2之間的轉換與sjis和cp932之間的轉換是不同的。下表舉例說明了這些不同。
轉換到ucs2:
sjis/cp932值 |
sjis→ ucs2轉換 |
cp932 → ucs2轉換 |
5C |
005C |
005C |
7E |
007E |
007E |
815C |
2015 |
2015 |
815F |
005C |
FF3C |
8160 |
301C |
FF5E |
8161 |
2016 |
2225 |
817C |
2212 |
FF0D |
8191 |
00a2 |
FFE0 |
8192 |
00a3 |
FFE1 |
81Ca |
00aC |
FFE2 |
從ucs2轉換:
ucs2值 |
ucs2 → sjis轉換 |
ucs2 → cp932轉換 |
005C |
815F |
5C |
007E |
7E |
7E |
00a2 |
8191 |
3F |
00a3 |
8192 |
3F |
00aC |
81Ca |
3F |
2015 |
815C |
815C |
2016 |
8161 |
3F |
2212 |
817C |
3F |
2225 |
3F |
8161 |
301C |
8160 |
3F |
FF0D |
3F |
817C |
FF3C |
3F |
815F |
FF5E |
3F |
8160 |
FFE0 |
3F |
8191 |
FFE1 |
3F |
8192 |
FFE2 |
3F |
81Ca |
這是MySQL參考手冊的翻譯版本,關于MySQL參考手冊,請訪問dev.mysql.com。 原始參考手冊為英文版,與英文版參考手冊相比,本翻譯版可能不是最新的。