mysql插入數(shù)據(jù)出現(xiàn)亂碼的根本原因是字符集配置不一致,解決方法是確保應用層、傳輸層、存儲層的字符集統(tǒng)一為utf8mb4。一、檢查并修改數(shù)據(jù)庫、表及字段的字符集為utf8mb4,使用show create database和show create table命令查看當前字符集,若非utf8mb4則通過alter語句修改;二、確認連接層字符集設置正確,執(zhí)行show variables like ‘character_set%’查看client、connection、results三個變量是否為utf8mb4,否則在連接后執(zhí)行set names ‘utf8mb4’或在my.cnf/my.ini中配置默認字符集;三、確保應用程序代碼中的編碼設置一致,如php中使用mysqli_set_charset或pdo連接時指定charset=utf8mb4,python中pymysql連接參數(shù)添加charset=’utf8mb4’,同時注意頁面或文件保存格式為utf-8,前端提交數(shù)據(jù)正確轉碼。以上三步完成后,多數(shù)亂碼問題即可解決。
MySQL插入數(shù)據(jù)出現(xiàn)亂碼,多數(shù)情況下是字符集配置不一致導致的。要解決這個問題,關鍵是搞清楚從客戶端到數(shù)據(jù)庫各個環(huán)節(jié)的字符集設置是否匹配。
一、確認數(shù)據(jù)庫和表的字符集設置
如果你在插入中文或特殊字符時出現(xiàn)亂碼,首先要檢查數(shù)據(jù)庫、表以及字段的字符集設置是否支持這些字符。常見的推薦字符集是 utf8mb4,它能支持更多字符(比如表情符號)。
查看數(shù)據(jù)庫默認字符集:
SHOW CREATE DATABASE your_database_name;
查看數(shù)據(jù)表字符集:
SHOW CREATE TABLE your_table_name;
如果發(fā)現(xiàn)不是 utf8mb4,可以修改:
- 修改數(shù)據(jù)庫默認字符集:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 修改數(shù)據(jù)表字符集:
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
二、檢查連接層的字符集設置
即使數(shù)據(jù)庫和表設置了正確的字符集,如果連接過程中使用的字符集不對,也會導致亂碼。常見問題出現(xiàn)在以下幾個地方:
你可以通過以下命令查看當前連接的字符集:
SHOW VARIABLES LIKE 'character_set%';
重點關注這幾個變量:
- character_set_client:客戶端發(fā)送數(shù)據(jù)使用的字符集
- character_set_connection:連接層使用的字符集
- character_set_results:返回結果使用的字符集
建議統(tǒng)一設置為 utf8mb4,可以在連接后執(zhí)行:
SET NAMES 'utf8mb4';
或者在配置文件中永久生效,在 my.cnf 或 my.ini 中添加:
[client] default-character-set=utf8mb4 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
三、注意應用程序代碼中的編碼設置
很多時候亂碼問題不在數(shù)據(jù)庫本身,而是在代碼層面。比如:
- 頁面或文件保存格式不是 UTF-8
- 連接數(shù)據(jù)庫時沒有指定字符集
- 前端提交的數(shù)據(jù)未正確轉碼
以 PHP 為例,在連接數(shù)據(jù)庫之后加上:
mysqli_set_charset($conn, "utf8mb4");
如果是 PDO:
new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
Python 使用 pymysql 的話也可以在連接參數(shù)中加 charset=’utf8mb4’。
總之,應用層、傳輸層、存儲層三個環(huán)節(jié)的字符集必須保持一致,才能避免亂碼。
基本上就這些操作。只要把數(shù)據(jù)庫、連接、代碼這三部分的字符集都設成 utf8mb4,大部分亂碼問題都能解決。有時候看似簡單,但一個小地方?jīng)]注意,就會一直出錯。