2012-10-05 42 views
6

Parsuję niektóre dane za pomocą PHP i wprowadzam do MySQL. Ale jeśli dane zawierają znaki specjalne, takie jak êm-Khê MySQL jest wyprowadzanie następujący błąd:Jak analizować znaki specjalne za pomocą PHP w MySQL?

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xEAm-Kh\xEA...' 

Po przetestować, MySQL nie jest problemem. (Kolumna tabeli i kolumny to utf8_general_ci) Kiedy INSERT that êm-Khê Ciągi do tabeli BEZPOŚREDNIO (ręcznie), przechodzi do niej. Tak więc MySQL może akceptować te dane.

Więc jakikolwiek pomysł, dlaczego jest to błąd na poziomie PHP?

Nie rozumiem i nie rozumiem dobrze kodowania wiedzy.

  • Dlaczego jest ê przekształcona w \xEA w zapytaniu?

więc kiedy uzyskać dane jak ê, jak mogę umieścić go w bazie danych, ponieważ jest ê bez zmian?

+1

Czy możesz opublikować kod, który wykonuje wkładkę DB –

+1

[Obsługa Unicode z przodu do tyłu w aplikacji sieciowej] (http://kunststube.net/frontback/). – DCoder

Odpowiedz

3

Tak więc problem jest to, że gra nie jest UTF8 db ale prawdopodobnie latin1 więc trzeba użyć funkcji PHP utf8_encode() lub wykonać SET NAMES utf8 po podłączeniu do bazy danych.

$handle = new PDO("mysql:host=localhost;dbname=dbname", 
'username', 'password', 
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

This thread ma jakieś dobre referencje i wyjaśnień

+0

PDO? Przepraszam, nie rozumiem co masz na myśli. Używam 'mysql_connect'. To nie tak. –

+1

Oh, OK, mam go za pomocą metody php 'utf8_encode()'. Dzięki x) –

+0

Warto wspomnieć, że po 5.3.6 powinieneś użyć '; charset = utf8' jako części ciągu połączenia. –

0

Domyślam się, że istnieje niedopasowanie kodowania między PHP i MySQL. ê tak naprawdę nie jest "przekształcany" w \xEA, tylko że MySQL nie wie, jaka powinna być sekwencja bajtowa EA, a zatem po prostu narzeka, że ​​surowe bajty są błędne. Najpierw musisz wiedzieć, jakie kodowanie napisów znajduje się w PHP; co zależy od tego, skąd pochodzą. Następnie musisz ustawić poprawne kodowanie połączenia MySQL, aby MySQL wiedział, w jakie kodowanie wysyłane są łańcuchy. Jak to zrobić, zależy od tego, jak dokładnie łączysz się z bazą danych.

Zapoznaj się z Handling Unicode Front To Back In A Web App, aby zapoznać się z podsumowaniem całego procesu.

+0

Witam, kodowanie źródłowe ciągu znaków w PHP to 'utf-8' i pochodzi z XML. Mam na myśli, że kod XML jest zakodowany jako 'utf-8'. –

+0

Następnie sprawdź, czy używasz 'bin2hex' na kwerendzie wysyłanej do bazy danych i sprawdź, jakie jest ustawione kodowanie połączenia. – deceze

-1

można skorzystać z tej funkcji. mysql_real_escape_string ($ user), mysql_real_escape_string ($ password));