エラーが発生します:
操作 '=' の照合 (utf8_general_ci,IMPLICIT) と (utf8_unicode_ci,IMPLICIT) の不正な組み合わせ
両方のテーブルを手動で変更しようとしましutf8_general_ci,IMPLICIT
たが、まだエラーが発生しています。
すべてのテーブルを変換して処理する方法はありutf8_general_ci,IMPLICIT
ますか?
各テーブルに対して、alter table ステートメントを実行する必要があります。ステートメントは次の形式に従います。
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name]
[COLLATE collation_name]
データベース内のすべてのテーブルを取得するには、次のクエリを実行する必要があります。
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="YourDataBaseName"
AND TABLE_TYPE="BASE TABLE";
それでは、MySQL にコードを書いてもらいます。
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE your_collation_name_here;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="YourDatabaseName"
AND TABLE_TYPE="BASE TABLE";
結果をコピーして実行できます。構文はテストしていませんが、残りは理解できるはずです。ちょっとした運動だと思ってください。
それが役立つことを願っています!
テーブル内のvarchar列の照合も変更するためのより良いオプション
SELECT CONCAT('ALTER TABLE `', TABLE_NAME,'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS mySQL
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA= "myschema"
AND TABLE_TYPE="BASE TABLE"
さらに、束スクリプトを使用する前に、utf8 以外の列に外部キーを持つデータがある場合
SET foreign_key_checks = 0;
これは、グローバル SQL が mySQL 用になることを意味します。
SET foreign_key_checks = 0;
ALTER TABLE `table1` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `table2` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `tableXXX` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
SET foreign_key_checks = 1;
ただし、mysql のドキュメントhttp://dev.mysql.com/doc/refman/5.1/en/charset-column.htmlに従っている場合は注意してください。
ALTER TABLE を使用して列をある文字セットから別の文字セットに変換する場合、MySQL はデータ値をマップしようとしますが、文字セットに互換性がない場合、データが失われる可能性があります。"
編集:特に列型列挙型では、完全に列挙型セットがクラッシュするだけです (特別な文字がなくても) https://bugs.mysql.com/bug.php?id=26731
@Namphibianの提案は私を大いに助けてくれました...
もう少し進んで、スクリプトに列とビューを追加しました
以下にスキーマの名前を入力するだけで、あとは自動で実行されます
-- set your table name here
SET @MY_SCHEMA = "";
-- tables
SELECT DISTINCT
CONCAT("ALTER TABLE ", TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as queries
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA=@MY_SCHEMA
AND TABLE_TYPE="BASE TABLE"
UNION
-- table columns
SELECT DISTINCT
CONCAT("ALTER TABLE ", C.TABLE_NAME, " CHANGE ", C.COLUMN_NAME, " ", C.COLUMN_NAME, " ", C.COLUMN_TYPE, " CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as queries
FROM INFORMATION_SCHEMA.COLUMNS as C
LEFT JOIN INFORMATION_SCHEMA.TABLES as T
ON C.TABLE_NAME = T.TABLE_NAME
WHERE C.COLLATION_NAME is not null
AND C.TABLE_SCHEMA=@MY_SCHEMA
AND T.TABLE_TYPE="BASE TABLE"
UNION
-- views
SELECT DISTINCT
CONCAT("CREATE OR REPLACE VIEW ", V.TABLE_NAME, " AS ", V.VIEW_DEFINITION, ";") as queries
FROM INFORMATION_SCHEMA.VIEWS as V
LEFT JOIN INFORMATION_SCHEMA.TABLES as T
ON V.TABLE_NAME = T.TABLE_NAME
WHERE V.TABLE_SCHEMA=@MY_SCHEMA
AND T.TABLE_TYPE="VIEW";
PhpMyAdmin を使用している場合は、次のことができるようになりました。
変換するテーブルが 250 以上ありました。5分強かかりました。
コピー アンド ペーストの bash スクリプトが必要な場合:
var=$(mysql -e 'SELECT CONCAT("ALTER TABLE ", TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_czech_ci;") AS execTabs FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="zabbix" AND TABLE_TYPE="BASE TABLE"' -uroot -p )
var+='ALTER DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_general_ci;'
echo $var | cut -d " " -f2- | mysql -uroot -p zabbix
zabbix をデータベース名に変更します。