これを修正するために「ツール」を使用することはお勧めしません。
何かを行う前に、データベースをダンプして、混乱した場合に備えてバックアップを作成してください;)
文字セットと照合を 2 つの方法で合理化できます
方法 1: データを移動する
すべてのテーブルで構成された正しい文字セットと照合順序を使用して、完全に新しいデータベースを作成します
新しいテーブルに INSERT SELECT ステートメントを入力します。
に挿入しnewdatabase
ます。table
SELECT * FROM olddatabase
.table
MySQL は自動的にデータを正しい文字セットに変換します
方法 2: テーブルを変更する
既存のテーブルの文字セットを変更すると、既存の内容もすべて変換されます
例えば
古いテーブル
CREATE TABLE `myWrongCharsetTable` (
`name` varchar(255) COLLATE latin1_german1_ci NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
デモ用にデータを入れる
INSERT INTO `myWrongCharsetTable` (`name`) VALUES ( 'I am a latino string' );
INSERT INTO `myWrongCharsetTable` (`name`) VALUES ( 'Mein Name ist Müller' );
INSERT INTO `myWrongCharsetTable` (`name`) VALUES ( 'Mein Name ist Möller' );
SELECT * FROM myWrongCharsetTable INTO outfile '/tmp/mylatinotable.csv';
UTF-8 コンソールでこれを行います
# cat /tmp/mylatinotable.csv
I am a latino string
Mein Name ist M▒ller
Mein Name ist M▒ller
右、奇妙な文字セット..これは、utf-8 コンソールに表示される latin 1 です
# cat /tmp/mylatinotable.csv | iconv -f latin1 -t utf-8
I am a latino string
Mein Name ist Müller
Mein Name ist Möller
うん、すべて良い
では、どうすればこれを修正できますか??
ALTER TABLE myWrongCharsetTable
MODIFY name varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
DEFAULT CHARSET = utf8 COLLATE utf8_unicode_ci;
それでおしまい :)
アウトファイルの再書き込み
mysql> SELECT * FROM myWrongCharsetTable INTO outfile '/tmp/latinoutf8.csv';
Query OK, 3 rows affected (0.01 sec)
mysql> exit
Bye
dbmaster-001 ~ # cat /tmp/latinoutf8.csv
I am a latino string
Mein Name ist Müller
Mein Name ist Möller
うまくいき、すべてうまくいき、私たちは幸せです
編集:
実は別の方法があります
方法 3: データをダンプ、変更、再ロードする
sed と awk に慣れている場合は、これを自動化するか、ファイルを手動で編集できます
# dump the structure, possibly routines and triggers
mysqldump -h yourhost -p -u youruser --no-data --triggers --skip-comments --routines yourdatabase > database_structure_routines.sql
# dump the data
mysqldump -h yourhost -p -u youruser --no-create-info --skip-triggers --skip-routines yourdatabase > database_data.sql
選択したエディターで を開き、database_structure_routines.sql
必要に応じてテーブルを変更します
/*!40101 SET character_set_client = utf8 */ のようなすべてのコメントをダンプファイルにドロップすることをお勧めします。これにより、テーブルのデフォルトが上書きされる可能性があるためです。
完了したら、新しいデータベースと構造を作成します
mysql > CREATE DATABASE `newDatabase` DEFAULT CHARSET utf8 COLLATE utf8_unicode_ci;
mysql > use `newDatabase`
mysql > ./database_structure_routines.sql;
テーブルを再確認することを忘れないでください
mysql > SHOW CREATE TABLE `table`;
それで問題ない場合は、データを再インポートできます。文字セットの変換が再び自動的に行われます
mysql -h yourhost -p -u youruser newDatabase < database_data.sql
お役に立てれば