Kodlama için PostgreSQL + PHP + UTF8 = geçersiz bayt dizisi

2 Cevap php

Ben mysql postgresql için bir db göç ediyorum. MySQL Veritabanı varsayılan harmanlama) postgres de UTF8 kullanıyor, ve ben (pg_escape_string ile verileri şifreleyen ediyorum, UTF8 olduğunu. Sebebi ne olursa olsun, ancak ben kötü kodlama hakkında bazı funky hataları çalıştırıyorum:

pg_query() [function.pg-query]: Query failed: ERROR: invalid byte sequence for encoding "UTF8": 0xeb7374 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client"

Bunu anlamaya çalışırken etrafında alay ve php garip bir şey yaptığını fark ettik; bir dize o sadece ascii karakter (örneğin "merhaba") varsa, kodlama ASCII. Dize herhangi bir ASCII olmayan karakter içeriyorsa, bu kodlama UTF8 (örn. "merhaba") olduğunu söylüyor.

Ben zaten UTF8 olan dizelerde utf8_encode () kullandığınızda, bu özel karakter öldürür yapar ve onları tüm kadar berbat, bu yüzden .. ben bu işe almak için ne yapabilirim?

(Şimdi o kadar asılı tam karakter "" dir, ama sadece değiştirin / arama yerine, bu yüzden bu tür sorun bir daha olmaz daha iyi bir çözüm bulmak istiyorum)

2 Cevap

Büyük olasılıkla, MySQL veritabanı veri UTF8 değildir. Bu oldukça yaygın bir senaryo. MySQL en azından tüm verilere uygun herhangi bir doğrulama yapmak değil, o yüzden bu sürece müşteri UTF8 olduğunu iddia gibi UTF8 olarak ona attı şey kabul. Onlar şimdi (onlar bile bir sorun düşünün eğer ya da değil, ben bilmiyorum) bu sabit olabilir, ama zaten yanlış db veri kodlanmış olabilir. PostgreSQL, tabii, bunu yüklemek tam doğrulama gerçekleştirir ve böylece başarısız olabilir.

Sen bilinmeyen karakterler görmezden, ya da "en iyi tahmin" bunları dönüştürmek için ayarlanabilir iconv gibi bir şey aracılığıyla veriyi isteyebilirsiniz.

Onlar aynı ilk 127 karakterleri paylaşan, çünkü MEZUNLARI, bir ASCII dize UTF-8 tam olarak aynıdır; böylece "Merhaba" ASCII gerekli dönüşüm yok, orada tam olarak UTF-8 "Merhaba" olarak aynıdır.

Tabloda harmanlama UTF-8 olabilir ama aynı kodlama ondan bilgi alma olmayabilir. Eğer bilgi ile sorun varsa Şimdi size vermek sen değil iken MySQL getirilen içerik UTF-8 olarak kodlanmış olduğu varsayılarak, çünkü pg_escape_string muhtemelen. Sana this page on MySQL documentation bakmak ve bağlantı kodlama görmek öneririz; muhtemelen harmanlama UTF-8 bir tablo getiriliyor konum ama bağlantı olduğunu (örneğin çéèêöà vb gibi özel karakterler UTF-8 kodlanmış olmayacak) Latin-1 gibi bir şeydir .