「全用 utf8」看似省心,實則可能導致:CPU/記憶體/磁碟浪費、索引失效、排序錯誤、亂碼難查。MySQL 字符集分三級:Database → Table → Column,各級可獨立指定,子級缺省繼承父級。
作者開發兩大核心腳本,直擊生產環境字符集審計與變更需求:
# 掃描全庫
./show_charset.py -d sakila
# 掃描指定表
./show_charset.py -d sakila -t actor
# 掃描指定欄位
./show_charset.py -d sakila -t actor -c first_name
輸出範例:
sakila.actor.first_name: utf8 utf8_general_ci
sakila.actor.last_name: utf8 utf8_general_ci
核心邏輯:查詢 information_schema.columns,過濾系統庫,支援庫/表/欄三級過濾,輸出 TABLE_SCHEMA.TABLE_NAME.COLUMN_NAME: CHARSET COLLATION。
# 將 testdb.t.name 從 latin1 改為 gbk
./modify.py testdb.t.name gbk
# 成功輸出執行的 DDL:
# ALTER TABLE testdb.t MODIFY COLUMN name varchar(10) CHARSET gbk
智能保留原欄位屬性:類型、長度、NULL/NOT NULL、DEFAULT 值,僅替換 CHARSET/COLLATE,避免手工拼裝 DDL 導致屬性丟失。
MySQLdb.cursors.DictCursor 獲取字典結果集,字段名可讀性強ALTER TABLE ... MODIFY COLUMN 完整保留原屬性try/finally 確保連接釋放,生產級健壯性optparse,支援幫助、版本、多參數組合完整代碼見原文,可直接部署生產環境使用。