Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah SET CHARACTER SET utf8 diperlukan?

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 dengan

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • dan SET CHARACTER SET x setara dengan

    SET 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:

  1. MySQL memperlakukan kueri yang masuk sebagai dikodekan dalam character_set_client .
  2. MySQL mentranskode pernyataan dari character_set_client ke dalam character_set_connection
  3. 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.
  4. 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 dari utf8 ke latin1 (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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pembaruan bersamaan MySQL

  2. Salin data ke tabel baru di MySQL

  3. hitung jumlah variabel Null per baris mysql

  4. Gabung kiri kondisi ON DAN sintaks kondisi lain dalam Doktrin

  5. MySQL - Menggabungkan beberapa kondisi WHEN dalam CASE