在本教學中,您將了解MySQL校對規則以及如何設定MySQL伺服器,資料庫,表和列的字元集和校對規則。
MySQL校對規則是用於比較特定字元集中的字元的一組規則。 MySQL中的每個字元集可以有多個校對規則,並且至少具有一個預設校對規則。兩個字元集不能具有相同的歸類。
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 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set
預設校對規則列的值指定字元集的預設校對規則。
按照慣例,字元集的校對規則以字元集名稱開頭,以_ci
(不區分大小寫)_cs
(區分大小寫)或_bin
(二進位制檔案)結尾。
要獲取給定字元集的所有校對規則,請使用SHOW COLLATION
語句如下:
SHOW COLLATION LIKE 'character_set_name%';
例如,要獲取latin1
字元集的所有校對規則,請使用以下語句:
SHOW COLLATION LIKE 'latin1%';
執行上面語句,得到用於latin1
字元集的MySQL校對規則,如下結果 -
mysql> SHOW COLLATION LIKE 'latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1 | 5 | | Yes | 1 |
| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |
| latin1_danish_ci | latin1 | 15 | | Yes | 1 |
| latin1_german2_ci | latin1 | 31 | | Yes | 2 |
| latin1_bin | latin1 | 47 | | Yes | 1 |
| latin1_general_ci | latin1 | 48 | | Yes | 1 |
| latin1_general_cs | latin1 | 49 | | Yes | 1 |
| latin1_spanish_ci | latin1 | 94 | | Yes | 1 |
+-------------------+---------+----+---------+----------+---------+
8 rows in set
如上所述,每個字元集都具有預設校對規則,例如latin1_swedish_ci
是latin1
字元集的預設校對規則。
MySQL允許您在四個級別指定字元集和校對規則:伺服器,資料庫,表和列。
在伺服器級別設定字元集和校對規則
注意MySQL使用latin1
作為預設字元集,因此,其預設校對規則為latin1_swedish_ci
。 您可以在伺服器啟動時更改這些設定。
如果在伺服器啟動時僅指定一個字元集,MySQL將使用字元集的預設校對規則。 如果您明確指定了一個字元集和校對規則,MySQL將使用資料庫伺服器中的字元集和校對規則來建立的所有資料庫。
以下語句通過命令列啟動並設定伺服器使用utf8
字元集和utf8_unicode_cs
校對規則:
$ mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
在資料庫級別設定字元集和校對規則
建立資料庫時,如果不指定其字元集和校對規則,MySQL將使用資料庫的伺服器的預設字元集和校對規則。
可以使用CREATE DATABASE或ALTER DATABASE語句來覆蓋資料庫級的預設設定,如下所示:
CREATE DATABASE database_name
CHARACTER SET character_set_name
COLLATE collation_name
-- 修改校對規則
ALTER DATABASE database_name
CHARACTER SET character_set_name
COLLATE collation_name
MySQL在資料庫級使用資料庫中建立的所有表的字元集和校對規則。
在表級別設定字元集和校對規則
資料庫可能包含與預設資料庫的字元集和校對規則不同的字元集和校對規則的表。
當您通過使用CREATE TABLE
語句建立表或使用ALTER TABLE
語句更改表的結構時,可以指定表的預設字元集和校對規則。
CREATE TABLE table_name(
)
CHARACTER SET character_set_name
COLLATE collation_name
或者 -
ALTER TABLE table_name(
)
CHARACTER SET character_set_name
COLLATE collation_name
在列級別設定字元集和校對規則
CHAR
,VARCHAR
或TEXT
型別的列可以使用與表的預設字元集和校對規則不同的,自己指定的字元集和校對規則。
可以按照CREATE TABLE
或ALTER TABLE
語句的列定義中的列指定字元集和校對規則,如下所示:
column_name [CHAR | VARCHAR | TEXT] (length)
CHARACTER SET character_set_name
COLLATE collation_name
以下是設定字元集和校對規則的規則:
我們來看一些設定字元集和校對規則的例子。
首先,我們使用utf8
作為字元集建立一個新資料庫,將utf8_unicode_ci
作為預設校對規則:
CREATE DATABASE mydbdemo
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
因為明確指定mydbdemo
資料庫的字元集和校對規則,所以mydbdemo
資料庫不會在伺服器級別採用預設字元集和校對規則。
其次,我們在mydbdemo
資料庫中建立一個名為t1
的新表,但不指定字元集和校對規則:
USE mydbdemo;
CREATE TABLE t1(
c1 char(25)
);
如上所示,我們並沒有為t1
表指定字元集和校對規則; MySQL將檢查資料庫級別以確定t1
表的字元集和校對規則。 在這種情況下,t1
表將使用utf8
作為預設字元集,utf8_unicode_ci
作為預設校對規則。
第三,對於t1
表,我們將其字元集更改為latin1
,並將其校對規則改為latin1_german1_ci
:
ALTER TABLE t1
CHARACTER SET latin1
COLLATE latin1_german1_ci;
t1
表中的c1
列使用latin1
作為字元集,latin1_german1_ci
作為校對規則。
第四,將c1
列的字元集更改為latin1
:
ALTER TABLE t2
MODIFY c1 VARCHAR(25)
CHARACTER SET latin1;
現在,c1
列使用latin1
字元集,但是它的校對規則呢? 是否從表的校對規則繼承了latin1_german1_ci
校對規則? 不是的,因為latin1
字元集的預設校對規則是latin1_swedish_ci
,所以c1
列具有latin1_swedish_ci
校對規則。
在本教學中,您已經了解了MySQL校對規則以及如何為MySQL伺服器,資料庫,表和列指定字元集和校對規則。