关于mysql:从utf8_general_ci转换为utf8_unicode_ci

Convert from utf8_general_ci to utf8_unicode_ci

我有一个utf8_-general_-ci数据库,我对转换为utf8_-unicode_-ci感兴趣。我试过以下命令

1
2
    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?


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之间的区别:

1
2
3
4
5
6
7
mysql> SELECT '?' = 'ss' COLLATE utf8_general_ci,
              '?' = 'ss' COLLATE utf8_unicode_ci;
+-------------------------------------+-------------------------------------+
| '?' = 'ss' COLLATE utf8_general_ci  | '?' = 'ss' COLLATE utf8_unicode_ci  |
+-------------------------------------+-------------------------------------+
|                                   0 |                                   1 |
+-------------------------------------+-------------------------------------+

但是,要在表中测试这一点,您需要存储这些值,并使用WHEREGROUP_CONCAT或其他东西来确定相等性。

您有什么"证据"证明ALTERs未能实现排序规则更改?

(处理其他意见:REPAIR应无关。CONVERT TO告诉ALTER实际修改数据,因此它应该完成所需的操作。)


必须更改每个表中每个字段的排序规则。如您所说,表的排序规则只是稍后创建的字段的默认值,数据库的排序规则只是稍后创建的表的默认值。