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

MySQL 5.0 字符集 #28 錯誤:源碼編譯缺失 GBK 導致主從同步中斷

     編輯:MySQL 資料庫相關知識

故障現場

Slave 錯誤日誌刷屏:

[ERROR] Slave: Error 'Character set '#28' is not a compiled character set and is not specified in the '/usr/local/mysql/share/mysql/charsets/Index.xml' file'

Master 寫入正常,Windows 客戶端插入數據即報錯。mysqlbinlog 顯示:

SET @@session.character_set_client=28,  -- 28 = GBK
    @@session.collation_connection=33,
    @@collation_server=8;

而 Linux 直連插入則為 character_set_client=8 (latin1)。

根因定位

  1. Windows 客戶端使用 GBK 編碼連接
  2. Slave 實例為源碼編譯安裝,編譯時未包含 GBK 字符集
  3. SHOW CHARACTER SET; 確認 Slave 實例確實缺少 GBK
  4. 對比發現:正常節點均為官方發布版(預編譯含所有字符集)

解決方案:替換為官方預編譯包

cd /usr/local
mv mysql mysql-old
tar zxvf mysql-5.0.37-linux-i686-glibc23.tar.gz
mv mysql-5.0.37-linux-i686-glibc23 mysql
# 保留原 data 目錄或重新初始化
/etc/init.d/mysql start

啟動後 SHOW CHARACTER SET; 已包含 GBK,同步恢復正常。

深度補充:字符集編譯機制

  • MySQL 編譯時通過 -DDEFAULT_CHARSET=latin1 -DWITH_EXTRA_CHARSETS=all 控制內置字符集
  • 源碼安裝若無 WITH_EXTRA_CHARSETS=all,僅包含 latin1、utf8 等極少集合
  • Index.xml 為字符集元數據索引,運行時動態加載依賴編譯產物
  • 字符集 ID:8=latin1、28=gbk、33=gbk_chinese_ci 等

避坑指南

  1. 生產環境優先使用官方二進制包(RPM/DEB/TAR.GZ),而非自行編譯
  2. 若必須編譯,cmake . -DWITH_EXTRA_CHARSETS=all 或 ./configure --with-extra-charsets=all
  3. 統一全鏈路字符集:character_set_server=utf8mb4、連接層 SET NAMES utf8mb4
  4. 監控 Slave_IO_Running / Slave_SQL_Running 及 Seconds_Behind_Master

擴展:MySQL 8.0 字符集變化

  • 默認字符集從 latin1 改為 utf8mb4
  • 默認校對規則 utf8mb4_0900_ai_ci(Unicode 9.0,無口音、大小寫不敏感)
  • 移除 utf8 別名,統一用 utf8mb4
  • 不再支持 WITH_EXTRA_CHARSETS 編譯選項,所有字符集內置
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved