简体   繁体   English

如何将utf8的MySQL默认排序规则设置为utf8_unicode_ci?

[英]How can I set MySQL's default collation for utf8 to utf8_unicode_ci?

I'm converting a database to the utf8 character set and utf8_unicode_ci collation. 我正在将数据库转换为utf8字符集和utf8_unicode_ci排序规则。 When altering a table's character set to utf8, MySQL automatically converts the columns of the table to the default collation for utf8: utf_general_ci. 将表的字符集更改为utf8时,MySQL会自动将表的列转换为utf8的默认排序规则:utf_general_ci。 I don't want to run hundreds of alter column commands to convert every column to utf8_unicode_ci, so can I set the default collation for utf8 to utf8_unicode_ci, as shown in information_schema?: 我不想运行数百个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 |
+---------------------------+--------------------+-----+------------+-------------+---------+

Note the IS_DEFAULT column. 注意IS_DEFAULT列。

Please also note that I'm not asking how to convert a database, table or column using ALTER ! 还请注意,我不是在问如何使用ALTER转换数据库,表或列!

Additionally adding collation_server = utf8_unicode_ci to my.cnf does not work. 另外,将collation_server = utf8_unicode_ci添加到my.cnf不起作用。

Need one ALTER per table, not per column ( Reference ): 每个表而不是每列需要一个ALTER参考 ):

ALTER TABLE foo CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

You can generate all the alters, then manually copy them to execute them. 您可以生成所有变更,然后手动复制它们以执行它们。 Something like 就像是

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');

But I suggest you CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci so that you can handle all of Chinese, plus Emoji. 但我建议您CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci以便您可以处理所有中文以及表情符号。

I hope you did CONVERT TO , not just MODIFY COLUMN . 我希望您做了CONVERT TO ,而不仅仅是MODIFY COLUMN The former converts the characters; 前者转换字符;前者转换字符。 the latter will make a mess of any 8-bit characters already in the table. 后者会使表中已有的任何8位字符弄乱。

One gotcha with utf8mb4 happens if you have indexes on VARCHAR(255) . 如果您在VARCHAR(255)上具有索引,则会发生utf8mb4错误。 If practical, shrink the size to 191 or less. 如果可行,请将尺寸缩小到191或更小。

Example

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)

我建议您使用所需的排序规则创建数据库,然后运行脚本以复制所有表和数据(在登台服务器中,建议您在登台服务器NOT IN THE PROD中进行此操作 ),检查是否可以正常进行登台然后在PROD中进行操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何找出MySQL字符集排序规则中各种符号的相对顺序(例如utf8_unicode_ci)? - How can I find out the relative order of various symbols in a MySQL character set collation (e..g utf8_unicode_ci)? mysql 5.5 utf-8归类utf8_unicode_ci,pymysql - mysql 5.5 utf-8 collation utf8_unicode_ci, pymysql 当mysql排序规则为utf8_unicode_ci时,sphinx排序规则 - sphinx collation when mysql collation is utf8_unicode_ci 在 Mac 上运行 mysql 时,ERROR COLLATION 'utf8_unicode_ci' 对 CHARACTER SET 'utf8mb4' 无效 - ERROR COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'utf8mb4' when running mysql on Mac utf8_unicode_ci似乎不是UTF8 - utf8_unicode_ci seems not to be UTF8 在AWS RDS上将MySQL服务器变量collat​​ion_connection设置为utf8_unicode_ci - Set MySQL server variable collation_connection to utf8_unicode_ci on AWS RDS Mysql索引COLLATE utf8_unicode_ci - Mysql Index COLLATE utf8_unicode_ci MySQL utf8_unicode_ci多语言支持 - Mysql utf8_unicode_ci multilanguage support 如何将所有行的排序规则从latin1_swedish_ci更改为utf8_unicode_ci? - How to change collation of all rows from latin1_swedish_ci to utf8_unicode_ci? MySQL中utf8_general_ci和utf8_unicode_ci有什么区别? - What's the difference between utf8_general_ci and utf8_unicode_ci in MySQL?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM