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

MySQL 4.1.4 建表指定 CHARSET=latin1 解決中文存儲亂碼

     編輯:MySQL 資料庫相關知識

快速修復方案

MySQL 4.1.4 中創建表時顯式指定 CHARSET=latin1,可暫時規避中文亂碼問題。

建表語句

CREATE TABLE pre_message_list_LU (
    id INT PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(255),
    create_time DATETIME
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

原理解析

  • MySQL 4.1 引入字符集系統,默認 latin1 (ISO-8859-1)
  • latin1 是單字節編碼,**不做任何字符集轉換**,直接存儲客戶端發送的原始字節
  • 若應用層以 GB2312/UTF-8 發送,數據庫按字節存儲,讀取時應用層再按同編碼解碼,邏輯上「不亂碼」
  • 本質是**繞過服務端字符集轉換層**,將數據庫視為二進制倉庫

缺陷與風險

  1. 無法使用服務端字符串函數:LENGTH() 返回字節數而非字符數,SUBSTRING() 可能截斷多字節字符
  2. 排序/比較錯誤:按字節值排序,非語義排序
  3. 跨應用編碼不一致致命:Java 用 UTF-8,PHP 用 GBK,數據庫無法統一解析
  4. 遷移極其困難:後期轉正確字符集需複雜的 CONVERT 操作

正確長久之計

-- 1. 數據庫級指定
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 2. 表級指定 (推薦 utf8mb4 支持 Emoji)
CREATE TABLE t (c VARCHAR(100)) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 3. 連接層指定 (JDBC URL / PHP mysqli_set_charset / Python charset)
-- 4. 服務端 my.cnf 強制
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4

總結

CHARSET=latin1 是**臨時應急方案**,僅適用於單一編碼應用、不需服務端字符處理的舊系統維護。**新項目務必全鏈路統一 UTF-8 (utf8mb4)**。

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