2013-03-06 25 views
10

Tabloya eklemek için basit bir SQL sözdizim var. Postgresql 8.4 kullanıyorum ve Database kodlamasını UTF8, ve Collation ve Character type için POSIX olarak ayarlıyorum.Postgresql PHP kodlama için geçersiz bayt dizisi UTF8

Eğer pgadmin3 altında çalıştırırsam, ancak PHP'de çalıştırırsam hata getirirseniz sorgu iyi olur.

"Internal Server Error: SQLSTATE[22021]: 
Character not in repertoire: 7 ERROR: 
invalid byte sequence for encoding \"UTF8\": 0xd85b\nHINT: 
This error can also happen if the byte sequence does not match the encoding expected by the server, 
which is controlled by \"client_encoding\" 

Yani ben şu anda PHP (PDO) den İSİMLERİ ve client_encoding ayarlamak, ama yine de ben yerli postgresql sürücüsünü pg_pconnect kullanıyorsam

$instance->exec("SET client_encoding = 'UTF8';"); 
$instance->exec("SET NAMES 'UTF8';"); 

pg_set_client_encoding($link, "UNICODE"); eseri Gözat aynı sorun var, ama çalıştı PDO'yu Sürücü olarak kullanıyorum.

ve ben de zaten

bu sorunu gidermek için başka bir yolu var mı mb_internal_encoding('UTF-8'); kurdu? i utf8_encode ile utf-8 içine kodlamak için arapça veya japon kelime gibi

+0

Tüm bağlantı/veritabanı kodlamanızı utf-8 kullanmak üzere ayarlayabilirsiniz, ancak orijinal dize utf-8 kodlanmamışsa yine de hataya neden olur. – datasage

+0

Lütfen pgAdmin'den "SHOW client_encoding;" sonucunu gönderir misiniz? – Houari

+1

Lütfen hata raporundan (0xd85b gibi) tek karakterli bir giriş ve karşılık gelen bayt dizisini gösterin. Ayrıca, işletim sisteminizin varsayılan metin kodlamasının ne olduğunu bize söylemelisiniz; Eğer bilmiyorsanız, Linux/unix kullanıyorsanız 'locale' komutunu çalıştırın. Orijinal kodlamayı ve orijinal metni bilmeden çok şey söylemek zor. –

cevap

4

deneyin olmayan ASCII kelimeyi eklemek() çalışırken

Bu hata yalnızca görünür. Ve;

$query = "INSERT INTO student (id, firstName, lastName, age) VALUES (1, 'myFisrtName', 'myLastName', 23)"; 

pg_exec($connection, utf8_encode($query)); 
+3

Tüm sorgunun kodlanması garip görünüyor. (Ayrıca, SQL örneğiniz daha kısa ve daha doğru yazılmış olabilir :) –

-1

bi'şey (hayır çalışma "adları 'UTF8' SET" gibi kötü unicode gelen iş ve tüm değişiklik java için Quercus) doğru unicode SQL sorgusu göndermek alamazsınız.END_BOLD Ben Base64 convertation bu çözümlemek: invalid byte sequence for encoding "UTF 8": 0x95 in ....
: sadece bir CSV içe aktarma sırasında da benzer bir durum vardı, eski bir yayında cevaplama

$name_enc = base64_encode($name);  
$res = $db->prepare(
      'INSERT INTO "MyTable"("ID", "Name") VALUES 
       ( nextval(\'gen_addresses\'), 
        convert_from(decode(?, \'base64\'), \'UTF8\'));' 
    )->execute(array($name_enc)); 
1

ama ben hatayı fark Sadece kullanarak PHP UTF-8 için Windows-1252 kodlama dönüştürerek hatayı düzelttik: Bu kimse yardımcı olacaktır mb_convert_encoding($fieldValue,'UTF-8','Windows-1252')

$query = "INSERT INTO student 
       (id, firstName, lastName, age) 
       VALUES 
       (1, '".mb_convert_encoding($firstName,'UTF-8','Windows-1252')."', 
        '".mb_convert_encoding($lastName,'UTF-8','Windows-1252')."', 23)"; 

Umut.