将 utf8_general_ci 表和字段转换为 utf8_unicode_ci

Posted

技术标签:

【中文标题】将 utf8_general_ci 表和字段转换为 utf8_unicode_ci【英文标题】:Converting utf8_general_ci tables and fields to utf8_unicode_ci 【发布时间】:2011-04-27 10:28:57 【问题描述】:

几年前我在设计我的应用程序数据库时犯了一个错误,我的表和表字段的排序规则设置是混合的。其中有些是 utf8_general_ci,有些是 utf8_unicode_ci。

这在连接具有不同排序规则的表时会导致问题。现在,我打算更改排序规则设置并使它们相同:utf8_unicode_ci。我将在我的所有表上运行这两个 SQL 查询。

ALTER TABLE  `table1` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE  `table1` CHANGE  `Action`  `Action` VARCHAR( 250 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;

我的问题是,运行这两个 SQL 查询是否会破坏任何字段值,尤其是那些包含重音字符的字段值?或者运行这两个查询是否安全?

期待您的来信。

感谢您的回答!

【问题讨论】:

【参考方案1】:

排序规则只影响字段中字符串的比较方式,而不影响它们的存储方式。只要您继续使用 utf8 编码,您就是安全的。

【讨论】:

是的,这是正确的。有细微的排序和比较差异,如德语 ß= ss 等,但不会更改任何数据。详情见dev.mysql.com/doc/refman/5.1/en/charset-unicode-sets.html 伙计们,请检查一下 (dev.mysql.com/doc/refman/5.1/en/charset-column.html),正如 Koteswasa 在下面提到的那样。感谢您的宝贵时间。 我的立场是正确的。仍然在相同的编码中,切换排序规则是安全的。【参考方案2】:

请参考 mysql 文档,其中讨论了更改字符集和排序规则

http://dev.mysql.com/doc/refman/5.1/en/charset-column.html

它的意思是-“如果您使用 ALTER TABLE 将列从一个字符集转换为另一个,MySQL 会尝试映射数据值,但如果字符集不兼容,则可能会丢失数据。”

--干杯

【讨论】:

不过,这两种字符编码是兼容的。事实上,它是完全相同的字符编码,只是排序时比较它们的方式不同。列上的任何索引都可能需要重建,仅此而已。

以上是关于将 utf8_general_ci 表和字段转换为 utf8_unicode_ci的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据库中的所有表转换为一种排序规则?

将 MySQL 字段字符集从 latin1 更改为 utf8_general_ci 会破坏元音变音 (ä,ö,ü)

将字段值存储为 JSON 数组而不是创建新表和一对多关系是不是有任何优点/缺点?

mysql 汉字根据首字母排序

mysql 为啥有些字段首字母是大写的在插入时会变成小写?

MYSQL数据库--定义表和字段的别名