我有一个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?
答案 0 :(得分:2)
SHOW CREATE TABLE
看看它是否确实在列上设置了CHARACTER SET
和COLLATION
,而不仅仅是默认设置。
<{1}} 之前CHARACTER SET
是什么?
对于某些 其中包含utf8的字段,请ALTERs
。这将有助于我们确定您是否真的在表中有utf8。字符的编码根据SELECT col, HEX(col) ...
而有所不同; CHARACTER SET
有助于发现这种情况。
排序(HEX
,WHERE
等)由ORDER BY
控制。索引可能必须根据您的COLLATION
重建。带索引的大表是否需要很长时间才能转换?
要真正看到ALTER TABLE
和utf8_general_ci
之间的区别,您需要“结合重音”,或者更简单地说,需要德语utf8_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
应无关紧要。REPAIR
告诉CONVERT TO
实际修改数据,因此它应该已完成所需的操作。)
答案 1 :(得分:1)
您必须更改每个表中每个字段的排序规则。正如您所说,表的排序规则只是稍后创建的字段的默认值,而数据库的排序规则只是稍后创建的表的默认值。