"KARAKTER SET utf8 SET" mı

3 Cevap php

Ben bizim veritabanı sınıfı (tabanlı PDO) Rewritting ediyorum ve bu saplandık. PHP ve MySQL UTF-8 ile çalışırken ben kullanılmak SET NAMES utf8 ve SET CHARACTER SET utf8 hem öğretti oldum.

PDO ben şimdi PDO::MYSQL_ATTR_INIT_COMMAND parametresini kullanmak istiyorum, ama sadece bir sorgu destekler.

SET CHARACTER SET utf8 gerekli midir?

3 Cevap

SET CHARACTER SET utf8 SET NAMES utf8 aslında character_set_connection sıfırlanır sonra ve collation_connection @@character_set_database ve {[(5) kullanarak, ]} sırasıyla.

manual bildiren

  • SET NAMES x eşdeğerdir

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • ve SET CHARACTER SET x eşdeğerdir

    SET character_set_client = x;
    SET character_set_results = x;
    SET collation_connection = @@collation_database;
    

oysa SET collation_connection = x, aynı zamanda dahili SET character_set_connection = <<character_set_of_collation_x>> çalıştırır ve SET character_set_connection = x içten uygular, aynı zamanda SET collation_connection = <<default_collation_of_character_set_x.

Yani aslında character_set_connection için @@character_set_database ve collation_connection için @@collation_database sıfırlama ediyoruz. Manuel bu değişkenlerin kullanımını açıklıyor:

What character set should the server translate a statement to after receiving it?

For this, the server uses the character_set_connection and collation_connection system variables. It converts statements sent by the client from character_set_client to character_set_connection (except for string literals that have an introducer such as _latin1 or _utf8). collation_connection is important for comparisons of literal strings. For comparisons of strings with column values, collation_connection does not matter because columns have their own collation, which has a higher collation precedence.

Bu Özetle, kodlama / kodlama prosedürü MySQL sorgu ve sonuçlarını işlemek için kullandığı bir çok adım şey:

  1. MySQL character_set_client olarak kodlanmış olarak gelen sorgu davranır.
  2. MySQL character_set_client içine gelen açıklama dönüşümü character_set_connection
  3. sütun dize değerlerini karşılaştırırken MySQL verilen veritabanı sütununun chracter setine character_set_connection adlı dize değerini dönüşümü ve sıralama ve karşılaştırma yapmak için sütun harmanlama kullanır değerleri.
  4. MySQL character_set_results (bu gibi üzerine sütun adları gibi sonuç meta sonuç verileri içerir yanı sıra) kodlanmış sonuç kümesi kurar

Yani bir SET CHARACTER SET utf8 tam UTF-8 desteği sağlamak için yeterli olmaz durum olabilir. latin1 ve utf8-charset ile tanımlanmış sütunlar varsayılan veritabanı karakter seti düşünün ve yukarıda anlatılan adımları geçmesi. latin1 UTF-8 adımda karakter bilgileri kaybedebilirsiniz kapsayabilir tüm karakterleri kapsamaz gibi 3.

  • Step 3: Given that your query is encoded in UTF-8 and contains characters that cannot be represented with latin1, bu karakterler sorgu başarısız yapma latin1 (varsayılan veritabanı karakter kümesi) için utf8 adlı kodlama kayıp olacak .

Bu yüzden SET NAMES ... karakter kümesi konuları işlemek için doğru yol olduğunu söylemek güvenli olduğunu düşünüyorum. Ben MySQL sunucu değişkenlerini kurma doğru eklemek olsa bile (tüm reuired değişkenler statik ayarlanabilir sizin my.cnf) her gerekli ekstra sorgu performans yükü sizi kurtarır bağlayın.

Kimden mysql manual:

SET CHARACTER SET is similar to SET NAMES but sets character_set_connection and collation_connection to character_set_database and collation_database. A SET CHARACTER SET x statement is equivalent to these three statements:

SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;

Uluslararası karakterler kümelerini desteklemek gerek, ben her zaman sadece bir veritabanı oluşturulması konusunda metin türü alanlarının karakter seti var.

Ben de her zaman UTF-8 kullandım.

PHP içinde aynı ayarlayın:

mb_internal_encoding( 'UTF-8' );