MySQLのすべてのテーブルのすべての列の文字セットと照合順序を変更する


18

すべての列のすべてのテーブルでこれらのステートメントを実行する必要があります。

alter table table_name charset=utf8;
alter table table_name alter column column_name charset=utf8;

MySQL内でこれを何らかの方法で自動化することは可能ですか?mysqldumpを避けたい

更新:リチャード・ブロノスキーは私に道を教えてくれました:-)

すべてのテーブルで実行する必要があるクエリ:

alter table DBname.DBfield CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

他のすべてのクエリを生成するクレイジークエリ:

SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';

1つのデータベースでのみ実行したかった。1つのパスですべてを実行するのに時間がかかりすぎていました。テーブルごとにフィールドごとに1つのクエリを生成していることが判明しました。また、テーブルごとに必要なクエリは1つだけでした(救助者とは異なります)。ファイルの出力を取得することは、私がそれを実現する方法でした。

ファイルへの出力を生成する方法:

mysql -B -N --user=user --password=secret -e "SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';" > alter.sql

最後に、すべてのクエリを実行します。

mysql --user=user --password=secret < alter.sql

リチャード、ありがとう。あなたは男だ!

回答:


16

まず第一に、私の言葉をただ信じないでください!これで私の提案をテストしてください:

select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema' limit 10; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema' limit 10;

その結果に満足している場合は、limit句を削除して出力をSQLスクリプトに保存するか、ここで説明するのと同じように空想を得て出力を直接mysqlにパイプします。次のようになります。

mysql -B -N --host=prod-db1 --user=admin --password=secret -e "select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema'; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema';" | mysql --host=prod-db1 --user=admin --password=secret

有効なSQLを使用して有効なSQLを生成することを考え始めると、ゲーム全体が変わります。あなたはそれのためにあなたが見つける何回の使用に驚くでしょう。


もうすぐ!しかし、構文を正しく取得できない
The Disintegrator

わかった。私は答えに正しい構文を追加しています。あなたのアイデアのルール
崩壊剤

4

実際には、テーブルでCONVERT TOを使用して、そのテーブル内のすべての列を文字セットと照合順序に変換することができます。

SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'databasename';

また、これを実行する実際のデータベースを選択する方が理にかなっています。したがって、この:

... WHERE TABLE_SCHEMA = 'databasename';

これよりも:

... WHERE TABLE_SCHEMA != 'information_schema';

しかし、本当にすべてのテーブルでそれを実行したい場合は、前者を使用できると思います。しかし、私には少し重いようです。:)


1

使用したすべての列の照合順序を変更するには

SELECT CONCAT(  'ALTER TABLE ',  `TABLE_NAME` ,  ' CHANGE `',  `COLUMN_NAME` ,  '` `',`COLUMN_NAME` ,  '` ',  `DATA_TYPE` ,  '(',  `CHARACTER_MAXIMUM_LENGTH` ,  ') CHARACTER SET utf8 COLLATE utf8_swedish_ci ;' ) FROM  `COLUMNS` WHERE  `TABLE_SCHEMA` =  <schema> AND  `COLLATION_NAME` !=  'utf8_swedish_ci' ORDER BY  `TABLE_NAME` ,  `ORDINAL_POSITION` ;

0

information_schemaデータベースを使用して、変更する必要がある列とテーブルを見つけることができます。あなたはそれらを見つけることができます:

SELECT table_name, column_name FROM information_schema.`COLUMNS`
WHERE table_schema='your database' AND collation_name LIKE 'latin%';

その後、SQLスクリプト、ストアプロシージャ、または好みの開発言語を使用して、変更を自動化できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.