首先检查Ubuntu系统的默认字符集是否为UTF-8(推荐),避免因系统字符集不匹配导致MySQL乱码。运行以下命令查看:
locale
若未设置为UTF-8(如LANG=en_US.UTF-8),需编辑/etc/default/locale文件,添加或修改为:
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_ALL=en_US.UTF-8
保存后重启系统或运行source /etc/default/locale使设置生效。
Ubuntu MySQL的配置文件通常位于/etc/mysql/mysql.conf.d/mysqld.cnf(部分版本可能在/etc/mysql/my.cnf)。用文本编辑器(如sudo nano)打开文件,按以下要求添加/修改字符集设置:
[client]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=1 # 强制客户端使用服务器字符集
[mysql]
default-character-set=utf8mb4
保存文件后,重启MySQL服务使配置生效:
sudo systemctl restart mysql # Ubuntu 16.04及以上版本
# 或 sudo service mysql restart(旧版本)
登录MySQL命令行,运行以下命令验证字符集是否配置正确:
SHOW VARIABLES LIKE 'character%';
预期输出应包含以下关键项(值为utf8mb4或utf8):
character_set_client:客户端字符集character_set_connection:连接字符集character_set_database:数据库默认字符集character_set_server:服务器默认字符集character_set_results:结果集字符集若仍有latin1等非UTF-8字符集,需继续调整数据库或表字符集。
若已创建的数据库或表存在乱码,需逐个修改其字符集(仅对新数据有效,旧数据需转码):
ALTER DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
注:CONVERT TO会同时修改表的字符集和所有列的字符集;若仅需修改表本身,可使用ALTER TABLE 表名 DEFAULT CHARACTER SET utf8mb4。若客户端连接时仍出现乱码,可在连接时强制指定字符集(如使用MySQL命令行):
mysql -u 用户名 -p --default-character-set=utf8mb4
或在编程语言(如Python)中连接时设置字符集:
import mysql.connector
config = {
'user': '用户名',
'password': '密码',
'host': 'localhost',
'database': '数据库名',
'charset': 'utf8mb4'
}
conn = mysql.connector.connect(**config)
utf8(MySQL中的utf8实际是utf8mb3,仅支持最多3字节字符)。UPDATE语句逐条修复。通过以上步骤,可彻底解决Ubuntu MySQL的乱码问题,确保数据在存储、传输和显示过程中的一致性。