我最近意识到我犯了一个大错误,前端编码为UTF-8,但在数据库端使用的是latin1。
我正在考虑将MySQL数据库切换到UTF-8。是否有“良好实践”的建议?我可以采取哪些推荐步骤?我应该注意哪些陷阱?
谢谢, Alex
我最近意识到我犯了一个大错误,前端编码为UTF-8,但在数据库端使用的是latin1。
我正在考虑将MySQL数据库切换到UTF-8。是否有“良好实践”的建议?我可以采取哪些推荐步骤?我应该注意哪些陷阱?
谢谢, Alex
最主要(也是最常见)的陷阱是希望ALTER DATABASE … DEFAULT CHARACTER SET
或ALTER TABLE … DEFAULT CHARACTER SET
会改变现有列的编码。
这些语句只影响在发出这些语句后创建的表和列。
您应该单独使用ALTER
修改每个表,使用:
ALTER TABLE mytable CONVERT TO CHARACTER SET UTF8;
只有当表中所有数据都处于正确编码时才有效(用于重新导入)。 如果不是,则会丢失数据:每个字段值将在第一个非法编码字符后被截断。
我遇到了 ß 字符的问题,仍未找到解决方法。应该可以通过类似于“忽略错误字符”或类似的方式解决,我想...
针对使用 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
我从我的书签中找到了这个。它有点老,但可能仍然适合您的需求:
http://www.oreillynet.com/onlamp/blog/2006/01/turning_mysql_data_in_latin1_t.html
latin1
列的方法,那肯定会有影响。Latin1
是UTF8
的子集。 - Quassnoilatin1
中但不在UTF8
中的字符名称?尝试将一个非latin1
字符插入到latin1
列中将导致警告Incorrect string value
并且该字符将被替换为?
标记。 - Quassnoilatin1
表中,看看会发生什么。使用任何客户端编码都可以。 - Quassnoilatin1
表中,然后发布转储文件。 - Quassnoi