Как я могу установить параметры сортировки MySQL по умолчанию для utf8 в utf8_unicode_ci?
Я конвертирую базу данных в набор символов utf8 и параметры сортировки utf8_unicode_ci. При изменении набора символов таблицы на utf8 MySQL автоматически преобразует столбцы таблицы в параметры сортировки по умолчанию для utf8: utf_general_ci. Я не хочу запускать сотни команд изменения столбцов для преобразования каждого столбца в 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
!
Дополнительно добавив collation_server = utf8_unicode_ci
my.cnf не работает.
2 ответа
Нужен один ALTER
за таблицу, а не за столбец ( ссылка):
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-битные символы уже в таблице.
Одна ошибка с utf8mb4 происходит, если у вас есть индексы на VARCHAR(255)
, Если возможно, уменьшите размер до 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)
Я бы посоветовал вам создать базу данных с нужной вам сортировкой и запустить скрипт для копирования всех таблиц и данных (на промежуточном сервере я предлагаю вам сделать это на промежуточном сервере НЕ В PROD), проверьте промежуточную проверку, если все работает затем сделайте это в ПРОД.