首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 參考手冊第 10 章:全球化支援深度解析 (字符集、校對規則、時區、本地化)

     編輯:MySQL 綜合教學

章節概覽

MySQL 參考手冊第 10 章「全球化」涵蓋國際化 (i18n) 與本地化 (l10n) 核心議題,包含字符集與校對規則的多層級配置、錯誤訊息語言選擇、時區支援、以及日期/月份名稱的本地化顯示。

10.1 字符集支援 —— 核心重點

10.1.1 基本概念:字符集 vs 校對規則

  • 字符集:符號集合及其編碼方式 (如 utf8、latin1)。
  • 校對規則:字符集內字符的比較/排序規則。每個字符集有多種校對規則,至少有一個預設值。命名慣例:字符集_語言_後綴,後綴 _ci (大小寫不敏感)、_cs (敏感)、_bin (二進制比較)。

10.1.2 MySQL 實作特色

  1. 支援多字符集同時儲存資料。
  2. 比較字串可指定不同校對規則。
  3. 同一伺服器實例可混合使用多種字符集/校對規則。
  4. 四級預設值層級:伺服器 → 資料庫 → 表 → 欄位,層層繼承。

10.1.3 指定字符集與校對規則的語法

伺服器級

# 啟動參數
mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
# 或配置檔 [mysqld] 區段
character-set-server=utf8
collation-server=utf8_unicode_ci

編譯時可透過 CMake 永久變更預設值:-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_unicode_ci。

資料庫級

CREATE DATABASE db_name
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_unicode_ci;

ALTER DATABASE db_name
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_unicode_ci;

規則:指定 CHARSET 與 COLLATE 皆用指定值;僅指定 CHARSET 用其預設 COLLATE;僅指定 COLLATE 推導其所屬 CHARSET;皆未指定則繼承伺服器級。

表級

CREATE TABLE t1 (c1 INT) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE t1 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

欄位級

CREATE TABLE t1 (
  c1 VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci
);
ALTER TABLE t1 MODIFY c1 VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci;

警告:ALTER TABLE ... MODIFY 轉換字符集時,若編碼不相容可能導致資料遺失。

字串常數與連線字符集

字串常數語法:[_charset_name]'string' [COLLATE collation_name]。若未指定,使用連線變數 character_set_connection、collation_connection。

關鍵指令 SET NAMES 'charset_name' [COLLATE 'collation_name'] 等同於同時設定:

SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;

10.1.4 連線字符集與校對規則

三個關鍵系統變數控制客戶端-伺服器交互:

  • character_set_client:客戶端發送 SQL 陳述式的編碼。
  • character_set_connection、collation_connection:伺服器將接收的陳述式從 client 轉換至 connection 編碼後處理。
  • character_set_results:伺服器回傳結果集/錯誤訊息前的編碼。

10.1.5 應用程式配置最佳實踐

  1. 資料庫級統一:CREATE DATABASE ... DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;,應用連線時執行 SET NAMES utf8。
  2. 伺服器級統一:配置檔設定 character-set-server、collation-server,並加 init_connect='SET NAMES utf8' 自動執行。
  3. 編譯時固化:CMake 參數 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci。

10.1.6 錯誤訊息字符集

MySQL 5.6 內部以 UTF-8 建構錯誤訊息,再依 character_set_results 轉換後發送給客戶端。若目標字符集無法表示某字符,會以 Unicode 代碼點格式 (\unnnn 或 \U00nnnnnn) 顯示。

10.1.7 校對規則深度解析

命名與使用

校對規則名以 _ci、_cs、_bin 結尾。可用於 ORDER BY、GROUP BY、DISTINCT、聚合函數、WHERE/HAVING 比較、LIKE 模式匹配等子句,語法:expr COLLATE collation_name。

優先級與強制性

  • COLLATE 子句優先級高於 || 運算子。
  • 校對規則必須屬於對應字符集,跨字符集使用會報錯 (ERROR 1253)。
  • 運算式中隱式校對規則解析遵循「強制性」規則:顯式 COLLATE (0) > 兩邊不同校對 (1) > 欄位/參數 (2) > 系統常數 (3) > 字串常數 (4) > NULL (5)。可用 COERCIBILITY() 函數查看。

_bin vs BINARY 關鍵差異

特性_bin (非二進制字串)BINARY (二進制字串)
儲存類型CHAR/VARCHAR/TEXTBINARY/VARBINARY/BLOB
比較單位字符 (依字符編碼值)位元組
字符集轉換支援不支援
大小寫轉換支援 (UPPER/LOWER 生效)不支援
尾隨空格比較PAD SPACE 行為 (忽略尾隨空格)嚴格比較位元組
插入填充CHAR(N) 不足以空格填充BINARY(N) 以 0x00 填充

10.1.8 字符集目錄

ASCII (U+0000~U+007F) 為 Unicode (U+0000~U+FFFF) 子集。字串運算結果目錄由輸入決定:ASCII 輸入產生 ASCII 目錄;函數無字串參數時依 character_set_connection 決定;多參數取最寬目錄 (Unicode > ASCII)。

10.1.9 受字符集影響的操作

  • 結果字串校對規則:顯式 COLLATE > 全同校對 > 無校對。
  • CONVERT(expr USING charset)、CAST(expr AS type CHARACTER SET charset) 進行編碼轉換。
  • SHOW 指令與 INFORMATION_SCHEMA 顯示編碼資訊。

10.1.10 Unicode 支援演進

字符集字節/字符支援範圍備註
ucs22BMP (基本多文種平面)固定長度
utf162 或 4BMP + 增補字符ucs2 擴展,大端序
utf16le2 或 4BMP + 增補字符utf16 小端序
utf324所有 Unicode固定 4 字節
utf8 (utf8mb3)1~3僅 BMP舊版 utf8 別名
utf8mb41~4BMP + 增補字符 (含 Emoji)推薦使用

遷移建議:ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4,但需檢查欄位長度 (如 VARCHAR(255) 在 utf8mb4 可能超過索引長度限制 767/3072 位元組)、索引鍵長度、最大行長度等限制。

10.1.11 升級 Unicode 支援的注意事項

  • 效能:4 字節 utf8mb4 比 3 字節 utf8 稍慢。
  • 連線字符集:SET NAMES utf8mb4 會使連線使用 4 字節編碼,舊版驅動可能異常。
  • 複製:主庫使用新字符集,從庫必須同版本支援。
  • 降級:舊版不支援 utf8mb4/utf16/utf32,需先轉換為 utf8 再匯入。

10.1.12 中繼資料編碼

資料庫/表/欄位名稱等中繼資料統一以 UTF-8 (character_set_system) 儲存。USER()、DATABASE() 等函數回傳 UTF-8,傳輸給客戶端時再依 character_set_results 轉碼。

10.1.13 欄位字符集轉換實務

  • 二進制類型 (BINARY/VARBINARY/BLOB) → 非二進制:ALTER TABLE t MODIFY col VARCHAR(50) CHARACTER SET charset; 需確保原資料皆為單一編碼,並清理尾隨 0x00。
  • 非二進制類型轉換:ALTER TABLE t MODIFY col CHAR(50) CHARACTER SET utf8; MySQL 自動重新編碼資料。

10.2 設定錯誤訊息語言

預設英文。透過 lc_messages_dir (目錄) 與 lc_messages (語言代碼,如 zh_CN) 系統變數指定。啟動參數:mysqld --lc_messages_dir=/usr/share/mysql --lc_messages=zh_CN。lc_messages 可動態修改 (GLOBAL/SESSION)。

10.3~10.5 新增字符集/校對規則/配置字符集

涉及原始碼修改與編譯,一般使用者較少用到,略過。

10.6 MySQL 時區支援

三層時區設定

  1. 系統時區:啟動時讀取 OS 時區,存於 system_time_zone (唯讀)。
  2. 伺服器全局時區:time_zone 全局變數,預設 'SYSTEM'。可啟動時指定 --default-time-zone='+08:00' 或配置檔設定。
  3. 會話時區:連線時繼承全局 time_zone,可執行 SET time_zone = '+08:00' 或 'Asia/Taipei' 獨立修改。

當前時區不影響 UTC_TIMESTAMP()、DATE/TIME/DATETIME 欄位儲存值 (均為 UTC),僅影響 NOW()、FROM_UNIXTIME()、CONVERT_TZ() 等函數的顯示/轉換結果。

命名時區表載入

MySQL 安裝後時區表為空,需手動載入:

# Linux 系統
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

驗證:SELECT COUNT(*) FROM mysql.time_zone_name; 非零即可用命名時區。夏令時規則驗證:SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');。

閏秒處理

MySQL 不儲存 23:59:60,閏秒會以 23:59:59 重複儲存。主鍵為 TIMESTAMP 時需注意唯一性衝突。

10.7 伺服器端本地化支援

lc_time_names 系統變數控制 DAYNAME()、MONTHNAME()、DATE_FORMAT() 的輸出語言 (如 en_US、zh_CN、es_MX),不影響 STR_TO_DATE()、GET_FORMAT() 解析。可動態設定:SET lc_time_names = 'zh_CN';。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved