首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 中文排序問題解決方案:BINARY 屬性與字符集編譯

     編輯:MySQL 資料庫相關知識

問題現象

MySQL 默認字符集 latin1 (ISO-8859-1),中文 GBK/UTF-8 在該字符集下按字節碼排序,導致拼音順序錯亂、大小寫不敏感轉換異常。

方案一:列級 BINARY 屬性(快速修復)

-- 建表時指定
CREATE TABLE t (name CHAR(10) BINARY) CHARSET=gbk;

-- 修改現有列
ALTER TABLE t MODIFY name CHAR(10) BINARY;
  • 原理: 強制按字節碼二進制比較,繞過字符集排序規則
  • 優點: 即時生效、無需重啟、不影響其他列
  • 缺點: 失去字符集語義排序(如拼音序)、大小寫敏感、LIKE 行為變化
  • 適用: 唯一鍵、主鍵、精確匹配場景

方案二:編譯安裝指定默認字符集(根治)

./configure --with-charset=gbk --with-collation=gbk_chinese_ci
# 或
./configure --with-charset=utf8 --with-collation=utf8_general_ci
  • 效果: 服務器級默認字符集/排序規則生效,新建表自動繼承
  • 要求: 源碼編譯安裝,二進制包無法修改
  • 現代做法: MySQL 5.5+ 推薦運行時配置 character_set_server=utf8mb4、collation_server=utf8mb4_unicode_ci

方案三:運行時指定字符集(推薦生產)

[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci

[client]
default_character_set = utf8mb4

[mysql]
default_character_set = utf8mb4

配合應用層連接字符串 SET NAMES utf8mb4,全鏈路統一字符集,徹底解決排序、存儲、顯示亂碼。

驗證排序效果

CREATE TABLE t (c VARCHAR(10) CHARSET gbk) ENGINE=InnoDB;
INSERT INTO t VALUES ('中'),('國'),('人'),('民');
SELECT * FROM t ORDER BY c;  -- 應按拼音序:民、人、國、中

總結

舊版本/快速修復 用 BINARY;新部署/根治 用 utf8mb4 + unicode_ci 運行時配置。避免混用字符集導致隱式轉換與索引失效。

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