2016-07-08 4 views
3

latin1にエンコードされた表があり、latin1_binを照合しています。私のテーブルでmysqlテーブルのエンコーディングを変更すると、何らかの副作用がありますか?

は、あなたが知っているように、この列には、テーブルのエンコードと照合を継承しますが、私は特別な保存するために始めているので、今から私がutf8utf8_general_ciをする、それを変更する必要がありますに、タイプ「TEXT」の列commentsあり文字はcommentsです。

次のようなコマンドを使用すると、何らかの副作用が発生しますか?

alter table notebooks modify comments text CHARACTER SET utf8 COLLATE utf8_general_ci; 

ありがとうございました。

+0

はい、フィールド単位の照合を設定できます。テーブルに設定したものが、明示的に1つのセットを持たないフィールドのデフォルトになります。とにかくテーブル全体を変換する方が良いでしょうし、すべてを1つの文字セットに入れておいてください。 –

+0

@MarcBと全く同意します。データベースのローカルバックアップを行い、エンコードを変換してデータをチェックします。あなたはこれらの指示に従うかもしれません - > http://stackoverflow.com/questions/6115612/how-to-convert-an-entire-mysql-database-characterset-and-collat​​ion-to-utf-8 – phaberest

+0

ところで、意志それは私の質問を遅くする? –

答えて

0

NATIVE文字セットの直接的な積分比較を含まない照合シーケンスを指定すると、クエリが遅くなります。それを著しく遅くするかどうかは別の問題です。これのランキングとテーブルのランキングを調べて、2つの結果を比較することは、ディスク上の情報をデータベースから取得することよりもずっと速いでしょうか?

3

危険性私はALTERが既存のテキストを破壊すると思います。

また、あなたの「名前」は中国語に見えるので、漢字を保存したいと思いますか?その場合は、utf8だけでなく、utf8mb4を使用する必要があります。これは、一部の中国語文字が4バイトを取り、Unicode BMPに含まれていないためです。

私はあなたが2段階必要があると考えている:

ALTER TABLE notebooks MODIFY comments BLOB; 
ALTER TABLE notebooks MODIFY comments TEXT 
      CHARACTER SET utf8mb4 COLLATE utf8mb4_general_520_ci; 

は、そうでない場合はlatin1の文字ががut8に "変換" されます。しかし、あなたが本当に中国語を列に持っているなら、latin1はありません。上記の2ステップの変更は、(1)キャラクタセットの知識を無効にし、(2)バイトが実際にutf8mb4でエンコードされていることを確立します。

最初の二つの変更を行い、その結果をテストすると

RENAME TABLE notebooks TO old; 
CREATE TABLE notebooks LIKE old; 
INSERT INTO notebooks SELECT * FROM old; 

を行い、安全であると。問題がある場合は、RENAMEで古いコピーを取り戻すことができます。

+0

ありがとうございました。実際に私はéèùçàのようなフランス語のアクセント記号付きの文字を保存しています...私の場合はutf8がうまくいきます。私は危険に遭っていましたが、幸いにも、ALTERを実行した後、既存のテキストは破壊されません。(私はなぜか分かりません)utf8mb4情報に感謝します。それを知ることは面白いことです。 –

+0

ああ、私はまだこの分野のすべてを予測することはできません。私はあなたのデータを破壊しない単一の変更がうれしいです。 –

関連する問題