91

エラーが発生します:

操作 '=' の照合 (utf8_general_ci,IMPLICIT) と (utf8_unicode_ci,IMPLICIT) の不正な組み合わせ

両方のテーブルを手動で変更しようとしましutf8_general_ci,IMPLICITたが、まだエラーが発生しています。

すべてのテーブルを変換して処理する方法はありutf8_general_ci,IMPLICITますか?

4

12 に答える 12

179

各テーブルに対して、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";

結果をコピーして実行できます。構文はテストしていませんが、残りは理解できるはずです。ちょっとした運動だと思ってください。

それが役立つことを願っています!

于 2012-06-02T05:48:16.613 に答える
72

テーブル内の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

于 2014-06-11T13:50:15.803 に答える
32

@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";
于 2016-11-19T00:06:35.920 に答える
13

PhpMyAdmin を使用している場合は、次のことができるようになりました。

  1. データベースを選択します。
  2. 「操作」タブをクリックします。
  3. [照合] セクションで、目的の照合を選択します。
  4. 「すべてのテーブルの照合を変更する」チェックボックスをクリックします。
  5. 新しい [すべてのテーブルの列の照合を変更する] チェックボックスが表示されます。
  6. 「すべてのテーブル列の照合順序を変更する」チェックボックスをクリックします。
  7. 「移動」ボタンをクリックします。

変換するテーブルが 250 以上ありました。5分強かかりました。

于 2020-08-07T02:24:17.027 に答える
1

コピー アンド ペーストの 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 をデータベース名に変更します。

于 2016-02-10T08:59:33.703 に答える