MySQL 5.1 到 5.5:所有 UTF-8 字符丢失!

MySQL 5.1 到 5.5:所有 UTF-8 字符丢失!

我决定升级我的 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

这可以通过以下方式修复

  1. 将数据库转储到 Latin1 文件中,然后将该文件导入为 UTF-8: 修复 MySQL 字符编码不匹配;或者
  2. 在MySQL中,通过转换binary来忽略错误的编码:

    UPDATE table SET column=CONVERT(CONVERT(column USING binary) USING utf8) WHERE id=123;
    

    修复 MySQL 中的列编码混乱

答案2

@CL 的答案。在调试方面对我帮助很大,但事实恰恰相反:数据库和备份文件都是用 latin1 编码的,但客户端期望 UTF-8 输出。

解决方案是确保character_set_client也设置为 latin1:

[client]
default-character-set = latin1

相关内容