从NameCheap迁移至Vultr后MySQL非英文文本乱码问题求助
嘿,我来帮你搞定这个非英文文本乱码的问题!这种情况大多是字符集在导出、导入或者数据库连接的某个环节没对齐导致的,咱们一步步排查解决:
第一步:检查目标数据库和表的字符集设置
首先得确保你的Vultr上的数据库和表本身就是用UTF-8系列的字符集(推荐utf8mb4,支持更多特殊字符,比utf8更全面):
- 登录MySQL终端(可以通过ServerPilot的数据库管理工具,或者SSH连接服务器后用命令登录),执行这条命令查看数据库的字符集:
SHOW CREATE DATABASE your_database_name; - 如果输出里的
CHARACTER SET不是utf8mb4或者utf8,赶紧修改:ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 接着检查单个表的字符集,执行:
SHOW CREATE TABLE your_table_name;
要是表的字符集不对,用这条命令修改(如果有多个表,得逐个执行,或者写脚本批量处理):ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
第二步:重新导入时明确指定字符集
你说导出文件是UTF-8,但导入时如果没告诉MySQL用UTF-8解析,它可能会用默认的latin1字符集来处理,直接导致乱码:
- 如果用命令行导入,一定要加上字符集参数:
mysql -u your_db_username -p --default-character-set=utf8mb4 your_database_name < your_exported_sql_file.sql - 如果用phpMyAdmin这类可视化工具,导入的时候在“导入选项”里把“文件字符集”选成
UTF-8,同时确认目标数据库的字符集已经是utf8mb4/utf8。 - 另外,打开你的导出SQL文件,看看开头有没有
SET NAMES utf8mb4;或者SET CHARACTER SET utf8mb4;的语句,如果没有,手动加在文件最顶部,这样导入时会强制MySQL用正确的字符集读取文件。
第三步:确保PHP连接数据库时设置正确的字符集
PHP5.6不管用的是mysqli还是旧的mysql扩展,连接数据库后都必须显式设置字符集,不然可能会出现连接层的字符集不匹配:
- 如果你用的是
mysqli扩展,代码里要加这一行:$conn = mysqli_connect('localhost', 'db_user', 'db_password', 'db_name'); // 连接成功后设置字符集 mysqli_set_charset($conn, 'utf8mb4'); - 要是用的是旧的
mysql扩展(虽然不推荐,但PHP5.6还支持),这么写:$conn = mysql_connect('localhost', 'db_user', 'db_password'); mysql_select_db('db_name', $conn); mysql_set_charset('utf8mb4', $conn); - 还要检查PHP的配置:登录ServerPilot仪表盘,找到你的应用,进入“PHP”选项卡,确认
default_charset设置的是UTF-8,如果不是改成它,然后重启PHP服务。
第四步:ServerPilot环境的额外确认
ServerPilot默认配置一般没问题,但还是可以检查下:
- 确保Web服务器(Nginx/Apache)的响应头包含
charset=utf-8。如果是Apache,可以在应用的.htaccess文件里加一行:AddDefaultCharset UTF-8;如果是Nginx,在ServerPilot的应用配置里确认charset utf-8;已经存在。
按照上面的步骤走一遍,应该就能解决乱码问题了!
内容的提问来源于stack exchange,提问作者Darshan Gowda
相关产品推荐
相关产品推荐

