2016-04-14 9 views
0

私はデータベースをutf8文字セットとutf8_unicode_ci照合に変換しています。テーブルの文字セットをutf8に変更すると、MySQLは自動的にテーブルのカラムをutf8:utf_general_ciのデフォルト照合に変換します。私は、ALTER列の数百人が、utf8_unicode_ci内にあらゆる列を変換するためのコマンドを実行したくないので、INFORMATION_SCHEMAに示すように?:utf8のMySQLのデフォルトの照合順序をutf8_unicode_ciに設定するにはどうすればよいですか?

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列を私は、UTF8はutf8_unicode_ci内するための既定の照合順序を設定することができます。

また、ALTERを使用してデータベース、テーブル、またはカラムを変換する方法は問いません。

さらに、collation_server = utf8_unicode_ciをmy.cnfに追加しても機能しません。

答えて

1

必要がある1つ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ビット文字を混乱させるでしょう。

インデックスがVARCHAR(255)の場合は、1つのgotchaが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) 
+0

あなたは 'ALTER TABLE'を実行した後table_name' FROM' SHOW FULL COLUMNSを見てみる場合は、カラムの照合がutf8_general_ciで、utf8_unicode_ci内ではない... – tjbp

+0

うーん。 ..私のために働いた。 –

+0

奇数...以前はあなたの列はlatin1_swedish_ciでしたか? – tjbp

0

データベースを作成し、すべてのテーブルとデータをコピーするスクリプトを実行することをお勧めします(ステージングサーバーでは、ステージングサーバーではなくプロダクトでこれを行うことをお勧めします)。すべてが動作すればステージングをチェックし、PRODで実行します。コラム(Reference)ごとのテーブルにつき

関連する問題