以下是原文翻译成繁體中文的版本:

MySQL - Collation

# MySQL - 校對:初學者指南

你好,未來的數據庫魔法師們!今天,我們將踏上一段令人興奮的旅程,探索MySQL校對的領域。別擔心如果你之前從未寫過一行代碼——我將成為你的友好導遊,我們會一步步攻克這個主題。所以,拿起你喜歡的飲料,我們來一起深入探討吧!

## 校對是什麼?

在我們深入細節之前,讓我們先了解校對到底是什麼。想像你正在組織一個龐大的圖書館。你需要一個系統來排列這些書籍,對吧?校對對我們的數據庫來說就是這個作用——它是一套規則,決定了字符如何被排序和比較。

把它當作是你數據庫的圖書管理員,決定 'apple' 是否排在 'banana' 之前,或者 'café' 和 'cafe' 是否應該被視為相同。

## 在MySQL中實現校對

現在我們有了一個基本概念,讓我們看看如何在MySQL中實現校對。這就像為我們想像中的圖書館的不同部分選擇不同的排序方法。

### 設置字符集和校對

MySQL允許我們在不同的層級設置校對。這就像為我們圖書館的不同樓層或部分設置不同的組織規則。

#### 在伺服器層級

在伺服器層級設置校對就像為整個圖書館建立一個默認規則。這樣做:

```sql
SET GLOBAL character_set_server = 'utf8mb4';
SET GLOBAL collation_server = 'utf8mb4_unicode_ci';

在這個例子中,我們將字符集設置為 'utf8mb4'(支持包括表情符號在內的廣泛字符!)和校對為 'utf8mb4_unicode_ci'。結尾的 '_ci' 代表 '不區分大小寫',意味著 'A' 和 'a' 將被視為相同。

在數據庫層級

有時候,我們希望不同部分有不同的規則。這樣設置特定數據庫的校對:

CREATE DATABASE my_bookstore
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

這將創建一個名為 'my_bookstore' 的新數據庫,帶有我們指定的字符集和校對。這就像在我們的圖書館中創建一個新樓層,並有它自己的組織系統。

在表層級

我們可以更具體,為單個表設置校對:

CREATE TABLE books (
    id INT PRIMARY KEY,
    title VARCHAR(100),
    author VARCHAR(50)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

這將創建一個帶有我們選擇的校對的 'books' 表。這就像有一個特殊的書架,並有它自己的排序規則。

顯示默認校對

對於目前正在使用的校對感到好奇嗎?MySQL為你準備了:

SHOW VARIABLES LIKE 'collation%';

這個命令將顯示所有與校對相關的設置。這就像問我們的圖書管理員:"嘿,我們現在在使用哪些組織系統?"

選擇正確校對的重要性

選擇正確的校對是非常重要的。讓我分享一個我教學經歷中的小故事。有一次,一個學生為一家多語種書店創建了一個數據庫。他們使用了默認校對,這不支持書名中的某些字符。結果?一些書在搜索中無法找到!這是選擇正確校對重要性的寶貴教訓。

校對方法

現在,讓我們看看一些常見的校對方法。把它們當作我們圖書管理員可能使用的不同組織書籍的方法:

校對後綴 描述 示例
_ci 不區分大小寫 'a' = 'A'
_cs 區分大小寫 'a' ≠ 'A'
_bin 二進制 比較確實的字節值
_general 通用目的 在性能和準確度之間取得平衡
_unicode Unicode感知 處理多種語言效果好

實際範例

讓我們通過一些真實世界的情景將我們的知識投入實踐:

範例 1:不區分大小寫的搜索

CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50) COLLATE utf8mb4_unicode_ci
);

INSERT INTO users (id, username) VALUES (1, 'John'), (2, 'john'), (3, 'JOHN');

SELECT * FROM users WHERE username = 'John';

這個查詢將返回所有三行,因為我們使用的是不區分大小寫的校對。這就像我們的圖書管理員說:"John、john 和 JOHN 對我來說都是同一個人!"

範例 2:使用不同校對進行排序

CREATE TABLE fruits (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

INSERT INTO fruits (id, name) VALUES 
(1, 'apple'), (2, 'Banana'), (3, 'cherry'), (4, 'Date');

SELECT * FROM fruits ORDER BY name COLLATE utf8mb4_general_ci;
SELECT * FROM fruits ORDER BY name COLLATE utf8mb4_bin;

第一個查詢將不區分大小寫進行排序(apple、Banana、cherry、Date),而第二個將根據ASCII值進行排序(Banana、Date、apple、cherry)。這就像請我們的圖書管理員先忽略大小寫進行排序,然後嚴格按照字母順序排序。

結論

恭喜你!你剛剛踏入了MySQL校對的世界。記住,選擇正確的校對就像為你的圖書館選擇完美的組織系統一樣——它確保一切都能輕鬆找到和比較。

隨著你在數據庫管理道路上的不斷前行,你將會遇到更多复雜的情景,在那時理解校對將至關重要。但別擔心——隨著練習,它會變得像組織你自己的書架一樣自然。

繼續實驗,保持好奇心,並且快樂編程!

Credits: Image by storyset