首页 文章

从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?

2 回答

  • 2

    SHOW CREATE TABLE 看看它是否真的在列上设置 CHARACTER SETCOLLATION ,而不仅仅是默认值 .

    ALTERs 之前 CHARACTER SET 是什么?

    对于某些应该包含utf8的字段,请执行 SELECT col, HEX(col) ... . 这将有助于我们确定您是否真的在表中有utf8 . 根据 CHARACTER SET ,字符的编码是不同的; HEX 有助于发现这种情况 .

    排序( WHEREORDER BY 等)由 COLLATION 控制 . 索引可能必须根据您的 ALTER TABLE 重建 . 带索引的大表是否需要'long'时间进行转换?

    要实际看到 utf8_general_ciutf8_unicode_ci 之间的区别,您需要"combining accent",或者更简单地说,需要 ß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 |
    +-------------------------------------+-------------------------------------+
    

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

    'proof'你有没有 ALTERs 未能实现校对改变?

    (解决其他评论: REPAIR 应该是无关紧要的. CONVERT TO 告诉 ALTER 实际修改数据,所以它应该已经完成了所需的操作 . )

  • 1

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

相关问题