Menggunakan SET CHARACTER SET utf8
setelah menggunakan SET NAMES utf8
benar-benar akan mengatur ulang character_set_connection
dan collation_connection
ke@@character_set_database
dan @@collation_database
masing-masing.
manual menyatakan bahwa
-
SET NAMES x
setara denganSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
dan
SET CHARACTER SET x
setara denganSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
sedangkan SET collation_connection = x
juga secara internal mengeksekusi SET character_set_connection = <<character_set_of_collation_x>>
dan SET character_set_connection = x
secara internal juga mengeksekusi SET collation_connection = <<default_collation_of_character_set_x
.
Jadi intinya Anda mengatur ulang character_set_connection
ke @@character_set_database
dan collation_connection
ke @@collation_database
. Manual menjelaskan penggunaan variabel-variabel ini:
Singkatnya, prosedur encoding/transcoding yang digunakan MySQL untuk memproses kueri dan hasilnya adalah beberapa langkah:
- MySQL memperlakukan kueri yang masuk sebagai dikodekan dalam
character_set_client
. - MySQL mentranskode pernyataan dari
character_set_client
ke dalamcharacter_set_connection
- saat membandingkan nilai string dengan nilai kolom, MySQL mentranskode nilai string dari
character_set_connection
ke dalam set karakter kolom database yang diberikan dan menggunakan susunan kolom untuk melakukan penyortiran dan perbandingan. - MySQL membangun kumpulan hasil yang dikodekan dalam
character_set_results
(ini termasuk data hasil serta metadata hasil seperti nama kolom dan sebagainya)
Jadi bisa saja terjadi SET CHARACTER SET utf8
tidak akan cukup untuk memberikan dukungan UTF-8 penuh. Pikirkan set karakter database default latin1
dan kolom yang didefinisikan dengan utf8
-charset dan lakukan langkah-langkah yang dijelaskan di atas. Sebagai latin1
tidak dapat mencakup semua karakter yang dapat dicakup oleh UTF-8 Anda dapat kehilangan informasi karakter pada langkah 3 .
- Langkah 3 : Mengingat bahwa kueri Anda dikodekan dalam UTF-8 dan berisi karakter yang tidak dapat direpresentasikan dengan
latin1
, karakter ini akan hilang pada transcoding dariutf8
kelatin1
(set karakter database default) membuat kueri Anda gagal.
Jadi saya rasa aman untuk mengatakan bahwa SET NAMES ...
adalah cara yang benar untuk menangani masalah set karakter. Meskipun saya mungkin menambahkan bahwa pengaturan variabel server MySQL Anda dengan benar (semua variabel yang diperlukan dapat diatur secara statis di my.cnf
Anda ) membebaskan Anda dari overhead kinerja kueri tambahan yang diperlukan di setiap sambungan.