![MySQL 5.1 到 5.5:所有 UTF-8 字符丢失!](https://linux22.com/image/25957/MySQL%205.1%20%E5%88%B0%205.5%EF%BC%9A%E6%89%80%E6%9C%89%20UTF-8%20%E5%AD%97%E7%AC%A6%E4%B8%A2%E5%A4%B1%EF%BC%81.png)
我决定升级我的 Debian 安装,使用 MySQL 5.5 几天后,我发现mysql
在终端上打印的是垃圾而不是 UTF-8 字符。
我查看了 生成的 SQL 文件mysqldump
,发现它已经包含了垃圾。今天,我删除了数据库并获取了运行良好的旧数据库的副本/var/lib/mysql/database_name/*
,令我惊讶的是,我仍然得到相同的结果。
生成的文件mysqldump
包含以下几行:
/*!40101 SET NAMES utf8 */;
/*!40101 SET character_set_client = utf8 */;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/var/lib/mysql/database_name/db.opt
新旧数据库的数据是相同的:
default-character-set=latin1
default-collation=latin1_swedish_ci
我现在能做什么?我希望我不会丢失整个数据库!
更新
show session variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
SELECT charset(name), hex(name), name FROM table WHERE id='123';
+---------------+----------------------------------------------+----------------------------+
| charset(name) | hex(name) | name |
+---------------+----------------------------------------------+----------------------------+
| latin1 | 457361C3BA204A6F73C3A92064652053616E74616E61 | Esaú José de Santana |
+---------------+----------------------------------------------+----------------------------+
最后一个命令中 name 的输出应该是Esaú José de Santana
答案1
MySQL输出和终端工作正常;问题是数据库中的文本被标记为latin1
,但实际上编码为utf8
。
这可以通过以下方式修复
- 将数据库转储到 Latin1 文件中,然后将该文件导入为 UTF-8: 修复 MySQL 字符编码不匹配;或者
在MySQL中,通过转换
binary
来忽略错误的编码:UPDATE table SET column=CONVERT(CONVERT(column USING binary) USING utf8) WHERE id=123;
答案2
@CL 的答案。在调试方面对我帮助很大,但事实恰恰相反:数据库和备份文件都是用 latin1 编码的,但客户端期望 UTF-8 输出。
解决方案是确保character_set_client
也设置为 latin1:
[client]
default-character-set = latin1