我有一个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?
2 回答
SHOW CREATE TABLE
看看它是否真的在列上设置CHARACTER SET
和COLLATION
,而不仅仅是默认值 .在
ALTERs
之前CHARACTER SET
是什么?对于某些应该包含utf8的字段,请执行
SELECT col, HEX(col) ...
. 这将有助于我们确定您是否真的在表中有utf8 . 根据CHARACTER SET
,字符的编码是不同的;HEX
有助于发现这种情况 .排序(
WHERE
,ORDER BY
等)由COLLATION
控制 . 索引可能必须根据您的ALTER TABLE
重建 . 带索引的大表是否需要'long'时间进行转换?要实际看到
utf8_general_ci
和utf8_unicode_ci
之间的区别,您需要"combining accent",或者更简单地说,需要ß
与ss
:但是,要在表中测试它,您需要存储这些值并使用
WHERE
或GROUP_CONCAT
或其他来确定相等性 .'proof'你有没有
ALTERs
未能实现校对改变?(解决其他评论:
REPAIR
应该是无关紧要的.CONVERT TO
告诉ALTER
实际修改数据,所以它应该已经完成了所需的操作 . )您必须更改每个表中每个字段的排序规则 . 正如您所说,表的排序规则只是稍后创建的字段的默认值,而数据库的排序规则只是稍后创建的表的默认值 .