python連接mysql查詢結(jié)果出現(xiàn)亂碼的解決方法是確保字符集設(shè)置一致。1. 確保數(shù)據(jù)庫和表使用utf8mb4字符集,可通過show create database和show create table檢查并用alter語句修改;2. python連接時在參數(shù)中指定charset=’utf8mb4’;3. 檢查并設(shè)置連接的校驗規(guī)則,執(zhí)行set names和set character set為utf8mb4;4. 確保終端或輸出環(huán)境支持utf-8編碼。按照以上步驟操作即可避免亂碼問題。
Python連接mysql查詢結(jié)果出現(xiàn)亂碼,通常是因為字符集設(shè)置不一致。要解決這個問題,關(guān)鍵在于正確配置數(shù)據(jù)庫連接參數(shù)中的charset選項,確保從數(shù)據(jù)庫到程序之間的字符傳輸是一致的。
1. 確保MySQL數(shù)據(jù)庫和表使用正確的字符集
在開始寫代碼之前,先檢查一下你的數(shù)據(jù)庫、表以及字段的字符集設(shè)置是否統(tǒng)一。推薦使用utf8mb4,它支持更廣泛的字符(包括表情符號):
-
數(shù)據(jù)庫字符集:
立即學(xué)習(xí)“Python免費學(xué)習(xí)筆記(深入)”;
SHOW CREATE DATABASE your_db;
應(yīng)該看到 CHARACTER SET utf8mb4
-
表字符集:
SHOW CREATE TABLE your_table;
同樣應(yīng)為 CHARACTER SET utf8mb4
如果發(fā)現(xiàn)不是,可以用以下語句修改:
ALTER DATABASE your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. Python連接時指定charset=’utf8mb4′
在用pymysql或mysql-connector-python等庫連接MySQL時,一定要在連接參數(shù)中顯式指定charset=’utf8mb4′,否則默認可能使用的是latin1或者其他編碼。
示例(以pymysql為例):
import pymysql conn = pymysql.connect( host='localhost', user='root', password='your_password', database='your_db', charset='utf8mb4', # 關(guān)鍵點在這里 cursorclass=pymysql.cursors.DictCursor )
如果你漏掉了這一步,即使數(shù)據(jù)庫是utf8mb4,Python讀出來的數(shù)據(jù)也可能顯示亂碼,尤其是中文或表情符號。
3. 檢查連接的校驗規(guī)則(Collation)
有時候雖然設(shè)置了charset=’utf8mb4’,但仍然有問題,可能是服務(wù)器端默認的collation設(shè)置不對。可以在連接后執(zhí)行一句SQL查看當(dāng)前連接的字符集配置:
SHOW VARIABLES LIKE 'character_set%';
你應(yīng)該看到類似下面的結(jié)果:
character_set_client | utf8mb4 character_set_connection| utf8mb4 character_set_database | utf8mb4 character_set_results | utf8mb4 character_set_server | utf8mb4
如果不是,可以在連接成功后主動執(zhí)行:
cursor.execute("SET NAMES 'utf8mb4'") cursor.execute("SET CHARACTER SET utf8mb4")
4. 確保終端/輸出環(huán)境也支持UTF-8
最后別忘了,打印或者展示的時候也要保證輸出環(huán)境支持UTF-8,比如你在命令行運行腳本,確保終端編碼是UTF-8;如果是網(wǎng)頁展示,也要設(shè)置html的meta頭或響應(yīng)頭為UTF-8。
基本上就這些。只要數(shù)據(jù)庫、連接參數(shù)和輸出環(huán)境三者都使用UTF-8或utf8mb4,Python連接MySQL就不會再出現(xiàn)亂碼問題了。