記事
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はこれを行ってデータを保存しようとします:あなたが持っているデータがターゲット文字セットで表現できる限り、変換は損失を被ることはありません。データの切り捨てが行われている場合は警告が出力され、ターゲットの文字セットで表現できないデータは?
に置き換えられます。