MySQL校對規則

2019-10-16 22:58:50

在本教學中,您將了解MySQL校對規則以及如何設定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_cilatin1字元集的預設校對規則。

設定字元集和校對規則

MySQL允許您在四個級別指定字元集和校對規則:伺服器,資料庫,表和列。

在伺服器級別設定字元集和校對規則

注意MySQL使用latin1作為預設字元集,因此,其預設校對規則為latin1_swedish_ci。 您可以在伺服器啟動時更改這些設定。

如果在伺服器啟動時僅指定一個字元集,MySQL將使用字元集的預設校對規則。 如果您明確指定了一個字元集和校對規則,MySQL將使用資料庫伺服器中的字元集和校對規則來建立的所有資料庫。

以下語句通過命令列啟動並設定伺服器使用utf8字元集和utf8_unicode_cs校對規則:

$ mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

在資料庫級別設定字元集和校對規則

建立資料庫時,如果不指定其字元集和校對規則,MySQL將使用資料庫的伺服器的預設字元集和校對規則。

可以使用CREATE DATABASEALTER 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

在列級別設定字元集和校對規則

CHARVARCHARTEXT型別的列可以使用與表的預設字元集和校對規則不同的,自己指定的字元集和校對規則。

可以按照CREATE TABLEALTER 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伺服器,資料庫,表和列指定字元集和校對規則。