【问题标题】:How can I set MySQL's default collation for utf8 to utf8_unicode_ci?如何将 MySQL 的 utf8 默认排序规则设置为 utf8_unicode_ci?
【发布时间】:2016-04-14 16:01:09
【问题描述】:

我正在将数据库转换为 utf8 字符集和 utf8_unicode_ci 排序规则。将表的字符集更改为 utf8 时,MySQL 会自动将表的列转换为 utf8 的默认排序规则:utf_general_ci。我不想运行数百条alter column命令来将每一列转换为utf8_unicode_ci,那么我可以将utf8的默认排序规则设置为utf8_unicode_ci,如information_schema所示?:

SELECT * FROM information_schema.COLLATIONS WHERE CHARACTER_SET_NAME = 'utf8';

+---------------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME            | CHARACTER_SET_NAME | ID  | IS_DEFAULT | IS_COMPILED | SORTLEN |
+---------------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci           | utf8               |  33 | Yes        | Yes         |       1 |
| utf8_bin                  | utf8               |  83 |            | Yes         |       1 |
| utf8_unicode_ci           | utf8               | 192 |            | Yes         |       8 |
| utf8_icelandic_ci         | utf8               | 193 |            | Yes         |       8 |
| utf8_latvian_ci           | utf8               | 194 |            | Yes         |       8 |
| utf8_romanian_ci          | utf8               | 195 |            | Yes         |       8 |
| utf8_slovenian_ci         | utf8               | 196 |            | Yes         |       8 |
| utf8_polish_ci            | utf8               | 197 |            | Yes         |       8 |
| utf8_estonian_ci          | utf8               | 198 |            | Yes         |       8 |
| utf8_spanish_ci           | utf8               | 199 |            | Yes         |       8 |
| utf8_swedish_ci           | utf8               | 200 |            | Yes         |       8 |
| utf8_turkish_ci           | utf8               | 201 |            | Yes         |       8 |
| utf8_czech_ci             | utf8               | 202 |            | Yes         |       8 |
| utf8_danish_ci            | utf8               | 203 |            | Yes         |       8 |
| utf8_lithuanian_ci        | utf8               | 204 |            | Yes         |       8 |
| utf8_slovak_ci            | utf8               | 205 |            | Yes         |       8 |
| utf8_spanish2_ci          | utf8               | 206 |            | Yes         |       8 |
| utf8_roman_ci             | utf8               | 207 |            | Yes         |       8 |
| utf8_persian_ci           | utf8               | 208 |            | Yes         |       8 |
| utf8_esperanto_ci         | utf8               | 209 |            | Yes         |       8 |
| utf8_hungarian_ci         | utf8               | 210 |            | Yes         |       8 |
| utf8_sinhala_ci           | utf8               | 211 |            | Yes         |       8 |
| utf8_german2_ci           | utf8               | 212 |            | Yes         |       8 |
| utf8_croatian_mysql561_ci | utf8               | 213 |            | Yes         |       8 |
| utf8_unicode_520_ci       | utf8               | 214 |            | Yes         |       8 |
| utf8_vietnamese_ci        | utf8               | 215 |            | Yes         |       8 |
| utf8_general_mysql500_ci  | utf8               | 223 |            | Yes         |       1 |
| utf8_croatian_ci          | utf8               | 576 |            | Yes         |       8 |
| utf8_myanmar_ci           | utf8               | 577 |            | Yes         |       8 |
+---------------------------+--------------------+-----+------------+-------------+---------+

注意IS_DEFAULT 列。

还请注意,我不是在问如何使用ALTER 转换数据库、表或列!

在 my.cnf 中额外添加 collation_server = utf8_unicode_ci 不起作用。

【问题讨论】:

    标签: mysql utf-8 configuration mariadb information-schema


    【解决方案1】:

    每个表需要一个 ALTER,而不是每列 (Reference):

    ALTER TABLE foo CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

    您可以生成所有更改,然后手动复制它们以执行它们。类似的东西

    SELECT CONCAT("ALTER TABLE ", table_schema, ".", table_name,
                  " CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
           ")
        FROM information_schema.tables
        WHERE table_schema NOT IN ('mysql', 'information_schema',
                                   'performance_schema', 'sys_schema');
    

    但我建议你CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci,这样你就可以处理所有的中文,加上表情符号。

    我希望你做到了CONVERT TO,而不仅仅是MODIFY COLUMN。前者转换字符;后者会弄乱表中已有的任何 8 位字符。

    如果您在 VARCHAR(255) 上有索引,则会出现 utf8mb4 的问题。如果可行,将大小缩小到 191 或更小。

    示例

    mysql> SHOW CREATE TABLE iidr\G
    *************************** 1. row ***************************
           Table: iidr
    Create Table: CREATE TABLE `iidr` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `key2` int(10) unsigned NOT NULL,
      `vc` varchar(99) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `key2` (`key2`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    mysql> SHOW FULL COLUMNS FROM iidr;
    +-------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
    | Field | Type             | Collation       | Null | Key | Default | Extra          | Privileges                      | Comment |
    +-------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
    | id    | int(10) unsigned | NULL            | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
    | key2  | int(10) unsigned | NULL            | NO   | UNI | NULL    |                | select,insert,update,references |         |
    | vc    | varchar(99)      | utf8_general_ci | YES  |     | NULL    |                | select,insert,update,references |         |
    +-------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
    3 rows in set (0.00 sec)
    
    mysql> ALTER TABLE iidr CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
    Query OK, 2 rows affected (0.14 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> SHOW FULL COLUMNS FROM iidr;
    +-------+------------------+------------------------+------+-----+---------+----------------+---------------------------------+---------+
    | Field | Type             | Collation              | Null | Key | Default | Extra          | Privileges                      | Comment |
    +-------+------------------+------------------------+------+-----+---------+----------------+---------------------------------+---------+
    | id    | int(10) unsigned | NULL                   | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
    | key2  | int(10) unsigned | NULL                   | NO   | UNI | NULL    |                | select,insert,update,references |         |
    | vc    | varchar(99)      | utf8mb4_unicode_520_ci | YES  |     | NULL    |                | select,insert,update,references |         |
    +-------+------------------+------------------------+------+-----+---------+----------------+---------------------------------+---------+
    3 rows in set (0.00 sec)
    
    mysql> SHOW CREATE TABLE iidr\G
    *************************** 1. row ***************************
           Table: iidr
    Create Table: CREATE TABLE `iidr` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `key2` int(10) unsigned NOT NULL,
      `vc` varchar(99) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `key2` (`key2`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci
    1 row in set (0.00 sec)
    

    【讨论】:

    • 如果您在运行ALTER TABLE 后查看SHOW FULL COLUMNS FROM table_name,则列的排序规则是utf8_general_ci,而不是utf8_unicode_ci...
    • 嗯...为我工作。
    • 奇怪...您的专栏以前是 latin1_swedish_ci 吗?
    • Gah,现在它向 utf8_unicode_ci 说明,一定是搞砸了我的测试。感谢您提供所有信息。
    • 这是一种解脱;我一直在努力找出可能出了什么问题。
    【解决方案2】:

    我建议您使用所需的排序规则创建一个数据库并运行一个脚本来复制所有表和数据(在暂存服务器中,我建议您在暂存服务器中执行此操作不在产品中),如果一切正常,请检查暂存,然后在 PROD 中执行。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2012-08-24
      • 2018-12-19
      • 2012-09-14
      • 1970-01-01
      • 2011-10-09
      相关资源
      最近更新 更多