sql >> データベース >  >> Database Tools >> phpMyAdmin

MySQLの列の照合を変更すると、既存のデータはどうなりますか?

    記事 http://mysqldump.azundris.com/archives/60 -Handling-character-sets.html これについて詳しく説明し、何が起こるかを示します。

    CHARACTER SET(実際にはエンコーディング)とCOLLATIONを混同していることに注意してください。

    文字セットは、ディスク上の文字列の物理的表現をバイト単位で定義します。これは、HEX()関数を使用して表示できます。たとえば、SELECT HEX(str) FROM t WHERE id = 1 MySQLが文字列のバイトをどのように格納するかを確認します。 MySQLが提供するものは、SET NAMES ....で定義された接続の文字セットによって異なる場合があります。 。

    照合はソート順です。文字セットによって異なります。たとえば、データはlatin1文字セットである場合がありますが、2つのドイツ語の並べ替え順序latin1_german1_ciまたはlatin1_german2_ciのいずれかに従って順序付けられている場合があります。選択に応じて、öなどのウムラウトはoeまたはoのいずれかに分類されます。

    文字セットを変更する場合は、テーブル内のデータを書き換える必要があります。 MySQLは、テーブル内のすべてのデータとすべてのインデックスを読み取り、一時的にディスクスペースを占有するテーブルの非表示のコピーを作成し、古いテーブルを非表示の場所に移動し、非表示のテーブルを所定の位置に移動してから、古いデータを削除して解放します。ディスク容量を増やします。その間のしばらくの間、そのための2倍のストレージが必要になります。

    照合を変更する場合、データの並べ替え順序は変更されますが、データ自体は変更されません。変更する列がインデックスの一部でない場合は、frmファイルを書き換える以外に何もする必要はなく、MySQLの十分に新しいバージョンではそれ以上のことはできません。

    インデックスの一部である列の照合を変更する場合、インデックスはテーブルのソートされた抜粋であるため、インデックスを書き換える必要があります。これにより、上記で概説したALTERTABLEテーブルコピーロジックが再度トリガーされます。

    MySQLはこれを行ってデータを保存しようとします:あなたが持っているデータがターゲット文字セットで表現できる限り、変換は損失を被ることはありません。データの切り捨てが行われている場合は警告が出力され、ターゲットの文字セットで表現できないデータは?

    に置き換えられます。

    1. SQLServerデータベース内のオブジェクトへのすべての参照を検索します

    2. Microsoft SSMS構文が単語構成を強調するのはなぜですか?

    3. データフローから変数へのSSISセットの結果セット

    4. MySQLですべてのdbトリガーを見つけるにはどうすればよいですか?