1. 程式人生 > >mysql 字符集&校驗規則

mysql 字符集&校驗規則

字符集,character set,就是一套表示字元的符號和這些的符號的底層編碼;而校驗規則,則是在字符集內用於比較字元的一套規則。下面我簡單舉個例子來說明一下:如在某個字符集“X”的A與a,他們的底層編碼分別是A=0,a=100。這裡符號“A”“a”和底層編碼“0”“100”就是字符集的概念範圍。假設我們要比較A與a的大小,我們得到a>A,因為我們是根據其底層編碼進行比較的,這就是這個字符集“X”的一種校驗規則“Z”(根據底層編碼來比較)。假設,現在有另外一種校驗規則,是先取其相反數,然後再比較大小,那麼就很顯然的得到a<A,這就是字符集“X”的另外一種校驗規則“Z1”。由此可見,一種字符集可能存在多個與之對應的校驗規則(一對多關係)。

    關於字符集與校驗規則,mysql支援:
1、使用字符集來儲存字串,支援多種字符集;
2、使用校驗規則來比較字串,同種字符集還能使用多種校驗規則來比較;
3、在同一臺伺服器、同一個資料庫或者甚至在同一個表中使用不同字符集或校對規則來混合組合字串;
4、可以在任何級別(伺服器、資料庫、表、欄位、字串),定義不同的字符集和校驗規則。

    查詢你的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 |
| .........| ......................      | ................    |      . |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
+----------+-----------------------------+---------------------+--------+
36 rows in set (0.00 sec)
   這裡的maxlen表示要用最大多少個位元組來儲存字符集的單個詞,default collation表示該字符集的預設校驗規則。
   你也可以利用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 |
+---------+-----------------------------+-------------------+--------+
4 rows in set (0.00 sec)
    查詢你的mysql資料庫所支援字符集的校驗規則,可以如下:
mysql> show collation;
+----------------------+----------+-----+---------+----------+---------+
| Collation            | Charset  | Id  | Default | Compiled | Sortlen |
+----------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci      | big5     |   1 | Yes     | Yes      |       1 |
| big5_bin             | big5     |  84 |         | Yes      |       1 |
| dec8_swedish_ci      | dec8     |   3 | Yes     |          |       0 |
| ........             | ....     |  .. | ...     | ...      |       . |
| eucjpms_bin          | eucjpms  |  98 |         | Yes      |       1 |
+----------------------+----------+-----+---------+----------+---------+
127 rows in set (0.00 sec)
   這裡compiled表示該collation所對應的character set是否被編譯到此mysql資料庫,通過此點就可以知道該mysql資料庫是否支援某個字符集。sortlen表示要在記憶體中排序時,該字符集的字元要佔用多少個位元組。
   你也可以利用like來進行篩選,如下:
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 (0.00 sec)

    大家可能已經發現collation的名字似乎有規律可循,其實的確也是這樣的,並且它也有些特徵,如下:
1、兩個不同的字符集不能有相同的校驗規則(字符集:校驗規則 = 1:n);
2、每個字符集都有一個校驗規則,就是對應的DEFAULT=YES的那個collation;
3、collation命名規則:字符集名_對應的語言名_ci/cs/bin,其中ci表示大小寫不敏感性,cs表示大小寫敏感性,bin表示二進位制。