将utf8_general_ci转换为utf8_unicode_ci

3

我有一个 utf8_general_ci 数据库,我想将其转换为 utf8_unicode_ci。 我尝试了以下命令:

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; (for every single table)

但是这似乎只会改变未来数据的字符集,而不会将现有的utf8_general_ci数据转换为utf8_unicode_ci。 有没有办法将现有数据转换为utf8_unicode_ci?


我认为这个链接会有所帮助 - https://dev59.com/r2Ml5IYBdhLWcg3wZGLo - Dhanashree
3个回答

2

SHOW CREATE TABLE可以查看列上是否真的设置了CHARACTER SETCOLLATION,而不仅仅是默认值。

ALTERs之前的CHARACTER SET是什么?

针对一些应该具有utf8的字段进行SELECT col, HEX(col) ...。这将帮助我们确定您是否真正在表中使用utf8。字符的编码基于CHARACTER SET的不同而不同;HEX有助于发现这种情况。

WHEREORDER BY等控制着COLLATION。索引可能需要根据您的ALTER TABLE进行重建。大表具有索引,转换需要很长时间吗?

要实际看到utf8_general_ciutf8_unicode_ci之间的区别,您需要一个“组合音标”,或者更简单地说,德语的ßss

mysql> SELECT 'ß' = 'ss' COLLATE utf8_general_ci,
              'ß' = 'ss' COLLATE utf8_unicode_ci;
+-------------------------------------+-------------------------------------+
| 'ß' = 'ss' COLLATE utf8_general_ci  | 'ß' = 'ss' COLLATE utf8_unicode_ci  |
+-------------------------------------+-------------------------------------+
|                                   0 |                                   1 |
+-------------------------------------+-------------------------------------+

然而,要在表中测试这些值,您需要存储这些值并使用“WHERE”或“GROUP_CONCAT”或其他方法来确定相等性。
您有什么证据表明“ALTERs”未能实现排序规则更改?
(回应其他评论:修复应该是无关紧要的。CONVERT TO告诉ALTER实际修改数据,因此它应该执行所需的操作。)

1

您需要更改每个表中每个字段的排序规则。正如您所说,表的排序规则仅是后来创建的字段的默认值,数据库的排序规则仅是后来创建的表的默认值。


如何更改每个表中每个字段的排序规则? - Khaleal
如果你对整个表进行“修复”操作,会使用新的排序规则重建它。 - Mad Dog Tannen

0

正如Lorenz Meyer所说,表格的排序规则仅适用于稍后创建的字段的默认值,你还需要显式地设置列的默认值。

这样的更改看起来像:

ALTER TABLE mytable CHANGE mycolumn mycolumn varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

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