将陀螺仪应用程序从 mysql (latin1) 迁移到 mariadb (utf8) 时出现字符编码问题

character encoding issues when migrating gyroscope app from mysql (latin1) to mariadb (utf8)

我正在将一个小型 Gyroscope 应用程序从 MySQL 迁移到 MariaDB。我之前问过这个问题,为什么 MariaDB 不会在 latin1 上启动作为服务器编码 (MariaDB won't start when character-set-server = latin1 is in my.cnf),但现在我已经接受了只使用 utf8。

导入数据转储后:

mysql -uwebuser -p ezine < dump.sql

,应该是 autotööstus 的东西显示为 autot??stus。另外我得到了这个错误:

排序规则(latin1_general_ci 隐式)和(utf8_general_ci 强制)的非法混合,存储 ??

尝试 1:我删除了数据转储中所有出现的 charset=latin1,导入提前终止并出现此错误:

指定的密钥太长;最大密钥长度为 767 字节

尝试 2:添加回字符集,但根据此 post 将其设置为 charset=utf8:MySQL Convert latin1 data to UTF8

导入有效,但 autotööstus 现在显示为 autotööstus

如何将数据转储解释为 latin1 编码内容但存入 utf8 存储?

如果您出于某种原因无法使用 latin1 作为默认系统编码,这里有一个快速解决方案:

保持数据转储不变。即使它是latin1编码,它也可以导入为utf8。

mysql> create database ezine character set utf8 collate utf8_general_ci;

mysql -uwebuser -p --default-character-set=utf8 ezine  < dump.sql

现在在您的网络应用程序中,您应该正确地看到 autotööstus

从现在开始,你的数据库"native currency"是utf8。转储数据库时,您必须小心,确保导出的文件仍然是 latin1 编码的。 否则你将得到过度编码的数据,例如 autotööstus.

mysqldump -uwebuser -p --default-char-set=latin1 ezine > dump.sql