1

私の会社では、データベース内のテーブルの作成が不十分でした。各テーブルには、異なる照合順序と文字セットがあります。

これは確かに非常に悪いことですが、サーバーがクラッシュするまでクエリのパフォーマンスが大幅に低下します (そして、優れたデータベースでさえありません...)。

テーブルの照合順序と文字セットを変換するための優れた MySQL ツール、コマンド、または手順があるかどうかを知りたいです。

alter table を実行して convert を実行するだけで、特殊文字が壊れます。それは正常ですか、それとも何か間違ったことをしていますか?

編集: 例: uft8 照合を使用したテーブル Finance と、ラテン語スウェーデン語を使用したテーブル経費があります。各テーブルには 1000 ~ 5000 行あります。次のクエリの実行には約 15 秒かかります。

select ex.* from expense ex
   inner join finance fin on fin.ex_id = ex.id

より大きなテーブルでより複雑なクエリを実行すると、照合順序が同じである場合にはるかに高速に実行されます。

編集 2: データベース内の別のエラー: 行 ID はすべて varchar(15) であり、int ではありません。

4

3 に答える 3

2

「照合」をある種の病気だと考える人々が作成したレガシー スキーマを継承する楽しさを私は知っています。

最良のオプションは、古い mysqldump を使用して、データを含むテーブルを SQL ダンプ ファイルにエクスポートすることです。次に、ダンプ ファイル内の create ステートメントを手動で変更して、文字セットと照合順序を設定します。私は「utf8」の大ファンです。ダンプ ファイルが巨大な場合は、コマンド ラインなどを使用sedして、エディターで開かなくてもファイルを効率的に編集できます。

次に、既存のテーブルを削除し、変更されたダンプを再インポートします。

私の経験では、これを行う他の方法はサイコロを振ることができます。

これは、それらすべてを同じストレージ エンジンに変換するか、MySQL サーバーを 5.5 にアップグレードする良い機会かもしれません。

于 2012-11-30T17:59:46.587 に答える
1

これを修正するために「ツール」を使用することはお勧めしません。

何かを行う前に、データベースをダンプして、混乱した場合に備えてバックアップを作成してください;)

文字セットと照合を 2 つの方法で合理化できます

方法 1: データを移動する

  • すべてのテーブルで構成された正しい文字セットと照合順序を使用して、完全に新しいデータベースを作成します

  • 新しいテーブルに INSERT SELECT ステートメントを入力します。

    に挿入しnewdatabaseます。tableSELECT * 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

お役に立てれば

于 2012-11-30T18:13:02.513 に答える
0

CONVERT または CAST を使用して文字セットを変更してみてください。新しい列を作成し、CAST を使用して新しい列に新しい修正された文字セットを入力します。
http://dev.mysql.com/doc/refman/5.0/en/charset-convert.html

于 2012-11-30T17:59:16.930 に答える