MySQL - 校對規則



MySQL 校對規則是一組用於決定如何比較和排序字元集的各種字元的規則。MySQL 支援多種字元集,包括 ASCII、Unicode 系統、二進位制等。

這些字元集的每個字元都受制於一個權重。MySQL 校對規則根據其各自的權重對字元進行排序。例如,當在一個字元集中比較兩個字元時,如果一個字元的權重比另一個字元重,則它更大;反之亦然。如果兩個字元的權重相等,則它們相等。

每個字元集必須至少有一個(或多個)校對規則,並且不能有兩個字元集具有相同的校對規則。

實現 MySQL 校對規則

MySQL 實現各種型別的校對規則以比較字元字串 -

  • 8 位字元集的簡單校對規則

  • 8 位字元集的複雜校對規則

  • 非 Unicode 多位元組字元集的校對規則

  • Unicode 多位元組字元集的校對規則

  • 雜項校對規則

每個字元集都有一個內建的二進位制校對規則,因此不需要重新定義它們。像這樣的內建校對規則在任何情況下都不得修改,以避免伺服器出現意外行為。

8 位字元集的簡單校對規則

  • 由於 8 位字元集只能容納最多 256 個字元,因此此型別的校對規則是透過使用長度為 256 的權重陣列來實現的。
  • 字元集中的每個字元都與權重一一對映。
  • 它是不區分大小寫的校對規則,因此相同字元的大寫和小寫具有相同的權重。

8 位字元集的複雜校對規則

  • 對於複雜的 8 位字元集,校對規則是透過使用函式定義字元的順序來實現的。
  • 在這裡,我們建立一個 C 原始檔,該檔案指定字元集屬性並定義必要的支援例程以正確地對該字元集執行操作。

非 Unicode 多位元組字元集的校對規則

  • 與單位元組(8 位)字元不同,多位元組字元的程式碼和權重之間存在兩種型別的關係。
  • 字元的權重等於其程式碼。
  • 字元程式碼與權重一一對映,其中權重不一定等於程式碼。

Unicode 多位元組字元集的校對規則

一些校對規則基於 Unicode 校對演算法 (UCA)。它們具有以下屬性 -

  • 如果一個字元有權重,則每個權重使用 2 個位元組。
  • 如果一個字元沒有權重,則該字元可忽略。
  • 單個字元可以有多個權重。這稱為擴充套件。例如,德文字母(SHARP S)的權重為 0x0FEA0FEA。
  • 多個字元在一起只能有一個權重。這稱為收縮。例如,“ch”在捷克語中是一個字母,其權重為 0x0EE2。

雜項校對規則

  • 不屬於任何先前類別的校對規則稱為雜項校對規則。

設定字元集和校對規則

MySQL 允許我們在三個不同的級別設定字元集和校對規則。下面描述了相同的內容

  • 在伺服器級別

  • 在資料庫級別

  • 在表級別

在伺服器級別

在 MySQL 中,字元集latin1將用作預設字元集。因此,預設校對規則將為latin1_swedish_ci。MySQL 允許我們在伺服器啟動級別更改這些預設設定。

在啟動 MySQL 伺服器時,如果我們指定一個字元集,它將使用該字元集的預設校對規則。但是,如果我們顯式地同時指定字元集和校對規則,則 MySQL 將對進一步建立的所有資料庫使用該組合。

示例

在以下查詢中,我們將字元集設定為 utf8,並將校對規則設定為 utf8_unicode_cs 用於伺服器。

mysqld --character-set-server=utf8 --collation-server=utf8_unicode_cs

如果--collation-server設定為使用者定義的校對規則名稱,則會發出警告。

在資料庫級別

當我們建立一個數據庫並且如果我們沒有提供任何字元集和校對規則時,資料庫將使用伺服器的預設字元集和校對規則。

我們可以使用 CREATE DATABASE 語句在資料庫級別覆蓋預設字元集和校對規則。

如果我們想覆蓋現有資料庫的預設設定,可以使用 ALTER DATABASE 語句。

語法

以下是覆蓋資料庫級別預設設定的基本語法 -

[CREATE | ALTER] DATABASE database_name  
CHARACTER SET character_set_name 
COLLATE collation_name;

示例

這裡,我們正在建立一個數據庫,並使用以下查詢將字元集指定為 utf8,並將排序規則指定為 utf8_unicode_ci。

CREATE DATABASE testdb
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

在表級別

在 MySQL 中,資料庫可以包含與資料庫字元集和排序規則不同的字元集和排序規則的表。

我們可以在使用 CREATE TABLE 語句建立表時指定預設的字元集和排序規則。

如果我們想覆蓋現有表的預設設定,可以使用 ALTER TABLE 語句。

語法

以下是使用 CREATE TABLE 語句為表指定預設字元集和排序規則的語法:

[CREATE | ALTER] TABLE table_name
column_name datatype (length)
CHARACTER SET character_set_name
COLLATE collation_name

示例

在以下查詢中,我們正在建立一個沒有任何字元集和排序規則的表。因此,它使用資料庫的字元集和排序規則。

CREATE TABLE CUSTOMERS(
   ID VARCHAR(45),
   NAME VARCHAR(45),
   AGE INT
);

現在,我們使用 ALTER TABLE 語句將字元集修改為“latin1”,並將排序規則修改為“latin_german_ci”。

ALTER TABLE CUSTOMERS
CHARACTER SET latin1
COLLATE latin1_german1_ci;

顯示預設校對規則

我們可以使用 SHOW CHARACTER SET 查詢顯示 MySQL 資料庫伺服器中所有字元集的預設排序規則。

SHOW CHARACTER SET;
使用者定義的排序規則在最新版本的 MySQL 中已棄用。因此,如果在任何 SQL 語句中使用它們,伺服器會發出警告。

每個字元集的排序規則字串以字元集名稱開頭,以 _ci(不區分大小寫)、_cs(區分大小寫)或 _bin(二進位制)結尾。

MySQL LIKE 子句

在 MySQL 中,使用 SHOW COLLATION 語句結合 LIKE 子句,我們可以指定一個模式來獲取與給定模式匹配的排序規則的名稱和其他資訊。

SHOW COLLATION LIKE 'greek%';

輸出

以上查詢返回所有名稱中包含greek的排序規則。

排序規則 字元集 ID 預設 已編譯 排序長度
greek_bin greek 70 1
greek_general_ci greek 25 1

MySQL WHERE 子句

我們可以使用 SHOW COLLATION 語句結合 WHERE 子句來檢索與指定條件匹配的排序規則名稱。

SHOW COLLATION WHERE Charset = 'cp1251';

輸出

以上查詢返回字元集 ID 等於“cp1251”的所有排序規則。

排序規則 字元集 ID 預設 已編譯 排序長度
cp1251_bin cp1251 50 1
cp1251_bulgarian_ci cp1251 14 1
cp1251_general_ci cp1251 51 1
cp1251_general_cs cp1251 52 1
cp1251_ukrainian_ci cp1251 23 1
廣告