Artikel http://mysqldump.azundris.com/archives/60 -Handling-character-sets.html membahas ini panjang lebar dan juga menunjukkan apa yang akan terjadi.
Harap perhatikan bahwa Anda mencampur SET KARAKTER (sebenarnya penyandian) dengan COLLATION.
Sebuah set karakter mendefinisikan representasi fisik dari string dalam byte pada disk. Anda dapat membuatnya terlihat, menggunakan fungsi HEX(), misalnya SELECT HEX(str) FROM t WHERE id = 1
untuk melihat bagaimana MySQL menyimpan byte string Anda. Apa yang diberikan MySQL kepada Anda mungkin berbeda, tergantung pada rangkaian karakter koneksi Anda, yang ditentukan dengan SET NAMES ....
.
Kolasi adalah urutan pengurutan. Itu tergantung pada set karakter. Misalnya, data Anda mungkin dalam kumpulan karakter latin1, tetapi mungkin diurutkan menurut salah satu dari dua urutan jerman latin1_german1_ci atau latin1_german2_ci. Tergantung pada pilihan Anda, Umlaut seperti ö akan diurutkan sebagai oe atau sebagai o.
Saat Anda mengubah kumpulan karakter, data di tabel Anda perlu ditulis ulang. MySQL akan membaca semua data dan semua indeks dalam tabel, membuat salinan tabel tersembunyi yang sementara memakan ruang disk, kemudian memindahkan tabel lama ke lokasi tersembunyi, memindahkan tabel tersembunyi ke tempatnya dan kemudian menjatuhkan data lama, membebaskan ruang disk. Untuk beberapa waktu, Anda akan membutuhkan penyimpanan dua kali lipat untuk itu.
Saat Anda mengubah susunan, urutan pengurutan data berubah tetapi bukan data itu sendiri. Jika kolom yang Anda ubah bukan bagian dari indeks, tidak ada yang perlu dilakukan selain menulis ulang file frm, dan versi MySQL yang cukup baru seharusnya tidak melakukan lebih banyak.
Saat Anda mengubah susunan kolom yang merupakan bagian dari indeks, indeks perlu ditulis ulang, karena indeks adalah kutipan tabel yang diurutkan. Ini sekali lagi akan memicu logika penyalinan tabel ALTER TABLE yang diuraikan di atas.
MySQL mencoba mempertahankan data dengan melakukan ini:Selama data yang Anda miliki dapat direpresentasikan dalam kumpulan karakter target, konversi tidak akan hilang. Peringatan akan dicetak jika terjadi pemotongan data, dan data yang tidak dapat direpresentasikan dalam kumpulan karakter target akan diganti dengan ?