为什么需要修改MySQL编码
你在往数据库里存用户名的时候,发现名字变成了一堆问号或者乱码?别急,这多半是编码没设置对。MySQL默认的编码可能是latin1,它不支持中文,一碰到汉字就抓瞎。把编码改成utf8或者utf8mb4,基本就能搞定这类问题。
查看当前编码设置
先登录MySQL,执行下面这条命令,看看现在的编码情况:
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';你会看到一堆变量,重点关注character_set_database、character_set_server和character_set_client这些。如果它们不是utf8或utf8mb4,那就得改了。
修改MySQL配置文件
在Windows上,配置文件通常是my.ini;Linux上一般是/etc/mysql/my.cnf或/etc/my.cnf。打开文件,在[mysqld]段落下加上这些内容:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'同时,在[client]和[mysql]部分也加上客户端的编码设置,避免连接时出问题:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4重启MySQL服务
改完配置得重启服务才能生效。Windows可以在服务管理里找MySQL,右键重启。Linux用命令:
sudo systemctl restart mysql重启之后再登录,重新执行SHOW VARIABLES LIKE 'character_set_%',看看是不是都变成utf8mb4了。
已有数据库和表怎么办
如果之前建的库或表还是老编码,需要手动转换。比如要把一个叫user_db的数据库改成utf8mb4:
ALTER DATABASE user_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;改某张表:
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;这样数据不会丢,还能正常显示中文。
连接程序也要注意编码
就算数据库设对了,程序连的时候没指定编码,照样可能乱码。比如PHP里连接MySQL,记得加参数:
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass, [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'
]);Python用pymysql的话,连接时写明charset:
conn = pymysql.connect(host='localhost', user='root', password='', database='test', charset='utf8mb4')小细节处理好了,整个链路就通了。
编码问题看起来挺烦,其实只要从配置、数据库、程序三头入手,一步步检查,基本都能解决。下次看到中文不再变问号,你就知道改对了。