1

これは何度も聞かれることは知っていますが、照合とエンコーディングの違いを理解するのに苦労しています。

さて、混合照合のテーブルを持つMySQLデータベース(実際にはいくつか)があります。現在、一部の列はutf8_unicode_ciであり、一部はデフォルトですlatin1_swedish_ci。それ以来utf8_unicode_ci、デフォルトとしてを使用しています。しかし、latin1には多くの「レガシー」列があります。

一貫性が必要であり、すべての列をutf8に変換したいと思います。幸い、データの99.9%は英語であり、(文字通り)スペイン語の住所(チルダ)を持つレコードがいくつかあります。とてもシンプルなことですが、私たちはそれを「正しい方法」で行い、あらゆる言語を完全にサポートしたいと考えています。したがって、utf8_unicode。

すべてのテーブルのすべての列を調べて、その変更を加える必要はありません。すべての列を変換する簡単なスクリプトはありますutf8_unicode_ciか?

また、私たちが探す必要のあるいくつかの落とし穴は何ですか?つまり、私が間違っていて、ロシア語または日本語で私が知らないレコードがある場合、問題が発生しますか?

そして、これは副次的な質問かもしれませんが、エンコーディングには、UTF8の方が優れています。これは、任意の言語を格納できるからです。のように、各文字は、数千文字の「グローバル」アルファベットであるべきものを表す2バイトまたは4バイトになりますか?そのアナロジーが愚かに聞こえるが理解しようとしている場合は申し訳ありません。そして、照合は、私が照会するときにそれらがどのようにソートされるかということです。A8 9F文字が文字HB3 2E文字のように保存されている場合、e前にH来るので最初に来るのでしょうか?A8B3

はぁ、頭が回転している。これが3つの異なる質問のように思われる場合は申し訳ありませんが、管理職に行って列を変換する必要があると言った場合、これが理由です。

ありがとう

4

1 に答える 1

1

頭に浮かぶ最も簡単な方法は次のとおりです。

  1. バックアップ データベースを作成しますcreate database olddb like dbname
  2. すべてのデータと構造をダンプにエクスポートします。mysqldump dbname > dbname.sql
  3. すべてをバックアップにインポートします。mysql -D olddb < dbname.sql
  4. テーブル構造のみエクスポート:mysqldump --no-data olddb > structure.sql
  5. 任意のテキスト エディターで structure.sql を開き、alllatin1_swedish_ciを次のように置き換えます。utf8_unicode_ci
  6. データベースを削除:drop database dbnameすべてのテーブルを簡単にクリアします。
  7. utf8 でデータベースを再作成します。 create schema dbname default character set utf8 collate utf8_swedish_ci
  8. 変更した構造を新しいデータベースにインポートします: mysql -D dbname < structure.sql. この時点で、古いデータベース全体が olddb にあり、空の完全な utf8 データベースが dbname にあるはずです。
  9. データベース内の各テーブルには、insert into dbname.tbl select * from olddb.tbl. show tables from olddb多くのテーブルがある場合は、出力をエクスポートしてその周りに挿入 SQL を追加することにより、これを行う SQL スクリプトを生成できます。
  10. 結果を確認し、問題がなければ、drop database olddb

残念ながら、MySQL はデータベースの名前変更をサポートしなくなりました。

于 2012-12-06T16:16:54.203 に答える