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

解決 MySQL 5.7 插入中文顯示問號(?)或報錯 Incorrect string value 的字符集配置指南

     編輯:MySQL 資料庫相關知識

問題現象

  1. 插入中文報錯:Incorrect string value: '\xCD\xF5\xD5\xBC\xBE\xA9' for column 'Sname' at row 1
  2. 插入成功但顯示亂碼/問號:??

根因

數據庫、表、列、連接四層字符集不一致,導致編碼轉換失敗。MySQL 5.7 默認 utf8mb4,但舊應用常假設 utf8(實為 utf8mb3)。

解決方案:分層配置字符集

1. 服務端配置 (my.cnf / my.ini)

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

注意:必須放在 [mysqld] 區塊末尾,否則導致服務啟動失敗。

my.ini 配置位置示意

2. 數據庫/表/列級顯式指定

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE t (c VARCHAR(100)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE t MODIFY c VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 應用端連接字符串強制指定

JDBC 示例:

jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

PHP PDO:

$dsn = "mysql:host=localhost;dbname=mydb;charset=utf8mb4";

4. 運行時動態設置(不推薦長期依賴)

SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;

驗證字符集配置

SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

期望輸出關鍵項均為 utf8mb4。

避坑指南

  • utf8 ≠ utf8mb4:前者僅支持 BMP 平面(3 字節),不支持 Emoji/罕見漢字(4 字節)
  • utf8mb4_unicode_ci vs utf8mb4_general_ci:前者按 Unicode 標準排序,後者簡化規則,性能略高但準確度略低
  • 修改配置後必須 重啟 MySQL 服務 生效
  • 既有表修改字符集需 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 實際轉換數據
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved