我有一个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?
3条答案
按热度按时间up9lanfz1#
SHOW CREATE TABLE
,看看它是否真的设置了 columns 上的CHARACTER SET
和COLLATION
,而不仅仅是默认值。CHARACTER SET
* 在ALTERs
之前 * 是什么?对 * 应该 * 包含utf8的字段执行
SELECT col, HEX(col) ...
。这将帮助我们确定表中是否真的包含utf8。字符的 * 编码 * 根据CHARACTER SET
而不同; X1 M7 N1 X有助于发现这种情况。WHERE
、ORDER BY
等)由COLLATION
控制。索引可能必须基于您的ALTER TABLE
重新构建。带索引的大型表是否需要“很长”时间来转换?要真正了解
utf8_general_ci
和utf8_unicode_ci
之间的区别,您需要一个“组合重音”,或者更简单地说,德语ß
与ss
:但是,要在表中测试它,需要存储这些值,并使用
WHERE
或GROUP_CONCAT
或其他方法来确定是否相等。您有什么“证据”证明
ALTERs
未能实现排序规则更改?(回应其他意见:
REPAIR
应该是无关的。CONVERT TO
告诉ALTER
实际修改数据,因此它应该已经完成了所需的操作。)muk1a3rh2#
你必须改变每个表中每个字段的排序规则,就像你说的,表的排序规则只是后来创建的字段的默认值,数据库的排序规则只是后来创建的表的默认值。
gzszwxb43#
正如Lorenz Meyer所说,表的排序规则只是以后创建的字段的默认值,您还需要显式地设置列的默认值。
这样的变化看起来像: