将MySQL从latin1编码更改为UTF-8

3

我最近意识到我犯了一个大错误,前端编码为UTF-8,但在数据库端使用的是latin1。

我正在考虑将MySQL数据库切换到UTF-8。是否有“良好实践”的建议?我可以采取哪些推荐步骤?我应该注意哪些陷阱?

谢谢, Alex

3个回答

5

最主要(也是最常见)的陷阱是希望ALTER DATABASE … DEFAULT CHARACTER SETALTER TABLE … DEFAULT CHARACTER SET会改变现有列的编码。

这些语句只影响在发出这些语句后创建的表和列。

您应该单独使用ALTER修改每个表,使用:

ALTER TABLE mytable CONVERT TO CHARACTER SET UTF8;

1
这会破坏所有非拉丁字符,不是吗? - Your Common Sense
1
@ColShrapnel:如果他们找到了进入latin1列的方法,那肯定会有影响。 Latin1UTF8的子集。 - Quassnoi
2
@ColShrapnel:请问您能否给出一个在 latin1 中但不在 UTF8 中的字符名称?尝试将一个非 latin1 字符插入到 latin1 列中将导致警告 Incorrect string value 并且该字符将被替换为 ? 标记。 - Quassnoi
2
@ColShrapnel:请尝试将俄语字符插入到latin1表中,看看会发生什么。使用任何客户端编码都可以。 - Quassnoi
2
@ColShrapnel:言行一致。请尝试将一个俄语字符插入到latin1表中,然后发布转储文件。 - Quassnoi
显示剩余4条评论

3
我在网络上发现了一个技巧(所以不是我的,但我忘记了来源),使用具有缺失编码的转储文件,然后再次使用正确编码导入该“空白”转储文件。

只有当表中所有数据都处于正确编码时才有效(用于重新导入)。 如果不是,则会丢失数据:每个字段值将在第一个非法编码字符后被截断。

我遇到了 ß 字符的问题,仍未找到解决方法。应该可以通过类似于“忽略错误字符”或类似的方式解决,我想...

针对使用 latin1 编码和 utf-8 编码内容的 MsSQL 表的示例步骤(适用于 Linux shell)如下:

mysqldump --opt --quote-names --skip-set-charset --default-character-set=latin1 mydatabase > /tmp/dump.sql
mysql --default-character-set=utf8 mydatabase < /tmp/dump.sql

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接