在mysql服务器上从latin1更改为utf8

在mysql服务器上从latin1更改为utf8,mysql,utf-8,character-encoding,mysqldump,latin1,Mysql,Utf 8,Character Encoding,Mysqldump,Latin1,我们最近开始接收到“utf8”编解码器无法解码位置30-31的字节:从数据库收集数据时数据意外结束(使用Python和SQLAlchemy)。我们找到了一些特殊日文字符的错误 所有表都有CHARSET=utf8,这些是我运行show variables时服务器上的设置 | character_set_client | latin1 | character_set_connection | latin1 | character_s

我们最近开始接收到
“utf8”编解码器无法解码位置30-31的字节:从数据库收集数据时数据意外结束(使用Python和SQLAlchemy)。我们找到了一些特殊日文字符的错误

所有表都有
CHARSET=utf8
,这些是我运行
show variables时服务器上的设置

| character_set_client                    | latin1
| character_set_connection                | latin1
| character_set_database                  | latin1
| character_set_filesystem                | binary
| character_set_results                   | latin1
| character_set_server                    | latin1
| character_set_system                    | utf8
| character_sets_dir                      | /usr/share/mysql/charsets/
| collation_connection                    | latin1_swedish_ci
| collation_database                      | latin1_swedish_ci
| collation_server                        | latin1_swedish_ci
如果我们不想将环境移动到utf8,建议使用哪些设置,以及如何导出和导入当前数据,我们必须使其与新设置一起工作

我读过一些关于将数据导出为
latin1
的文章,方法是将
--default character set=latin1
添加到mysqldump命令,然后将其导入具有新设置的数据库,但由于我们的原始表已经是utf8格式,这将不起作用

读取此线程后尝试设置连接:


这解决了应用程序崩溃的问题,但所有旧数据都已损坏。

您可以通过以下单个查询转换表的排序规则:

ALTER TABLE <yourtable> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE转换为字符集utf8 COLLATE utf8\u unicode\u ci;

您实际上有拉丁语1数据。您需要获取它,将其编码为UTF-8,然后重新导入UTF-8排序规则表。我认为您不能简单地更改数据库和表的编码。确保在配置中或使用
设置名称
也将连接设置为UTF-8。如果您进行备份并尝试转换?尝试设置连接,则可以解决应用程序崩溃的问题,但会损坏旧数据。我已经更新了这个问题。所以如果表有utf8编码,并且连接是拉丁1,那么实际数据仍然存储为拉丁1@Dan来自德国混合编码通常是个坏主意。这就像比较EXE和PDF文件——你不能。它们有不同的字节,不同的字符有不同的字节长度,不同的标题(比如BOM)。当您有一个UTF-8表并使用latin1连接使用PHP获取数据时,您将在latin1变量中获取UTF-8数据,数据将被损坏。您还可能会遇到双重编码。在这种情况下,您最好的资源是performance博客,作者包括MariaDB、Percona、InnoDB核心开发人员: