Często widzę coś podobnego do tego poniżej w skryptach PHP używających MySQL
query("SET NAMES utf8");
Nigdy nie musiałem tego robić dla żadnego projektu, więc mam kilka podstawowych pytań na ten temat.
- Czy robi się to tylko z PDO?
- Jeśli nie jest to rzecz specyficzna dla ChNP, to jaki jest cel tego robić? Zdaję sobie sprawę, że to ustawia kodowanie dla mysql, ale mam na myśli, że nigdy nie musiałem go używać, więc dlaczego miałbym go używać?
Odpowiedzi:
Jest potrzebny, gdy chcesz wysłać dane do serwera zawierające znaki, których nie można przedstawić w czystym ASCII, takie jak „ñ” lub „ö”.
Jeśli instancja MySQL nie jest skonfigurowana tak, aby domyślnie oczekiwać kodowania UTF-8 od połączeń klientów (wiele z nich, w zależności od lokalizacji i platformy).
Przeczytaj http://www.joelonsoftware.com/articles/Unicode.html, jeśli nie wiesz, jak działa Unicode.
Przeczytaj, czy używać opcji „SET NAMES”, aby zobaczyć alternatywne opcje SET NAMES i o co dokładnie chodzi.
źródło
SET NAMES UTF8
?SELECT
instrukcji.Z instrukcji :
Bardziej szczegółowo (i po raz kolejny bezpłatnie usunięty z podręcznika ):
źródło
Właściwe kodowanie jest naprawdę trudne - jest zbyt wiele warstw:
Polecenie SQL „SET CHARSET utf8” z PHP zapewni, że strona klienta (PHP) otrzyma dane w utf8, niezależnie od tego, jak są one przechowywane w bazie danych. Oczywiście najpierw należy je prawidłowo przechowywać.
Definicja DDL a dane rzeczywiste
Kodowanie zdefiniowane dla tabeli / kolumny nie oznacza tak naprawdę, że dane są w tym kodowaniu. Jeśli zdarzyło ci się mieć tabelę zdefiniowaną jako,
utf8
ale przechowywaną jako inne kodowanie, MySQL potraktuje je jakoutf8
i masz kłopoty. Co oznacza, że musisz najpierw to naprawić.Co sprawdzić
Musisz sprawdzić, jakie kodowanie przepływu danych na każdej warstwie.
Upewnij się, że wszędzie jest właściwy.
Konwersja
Jeśli otrzymujesz dane np.
windows-1250
I chcesz je przechowywaćutf-8
, użyj tego SQL przed zapisaniem:Jeśli masz dane w DB jako
windows-1250
i chcesz je odzyskaćutf8
, użyj:Jeszcze kilka uwag:
źródło
To zapytanie powinno być wpisane przed zapytaniem, które tworzy lub aktualizuje dane w bazie danych, takie zapytanie wygląda następująco:
Zauważże powinieneś napisać kod, którego używasz w nagłówku np. Jeśli używasz utf-8 dodajesz go w ten sposób w nagłówku albo spowoduje to problem z Internet Explorerem
więc twoja strona wygląda tak
źródło
Rozwiązaniem jest
źródło
Zamiast robić to za pomocą zapytania SQL, użyj funkcji php: mysqli :: set_charset mysqli_set_charset
z http://www.php.net/manual/en/mysqli.set-charset.php
źródło
Dziękuje wszystkim!
nie używaj: query ("SET NAMES utf8"); to jest konfiguracja, a nie zapytanie. umieść to zaraz po rozpoczęciu połączenia za pomocą setCharset () (lub podobnej metody)
mała rzecz na parctice:
status:
Przechowywanie i odczytywanie danych nie stanowi problemu, o ile mysql może obsługiwać znaki. jeśli zajrzysz do bazy danych, zobaczysz, że jest w niej bzdura (np. używając phpmyadmin).
do tej pory nie stanowi to problemu! (źle, ale działa często (w Europie)).
.. chyba, że inny klient / program lub zmieniona biblioteka, która działa poprawnie, odczyta / zapisze dane. to masz duże kłopoty!
źródło
Nie tylko PDO. Jeśli sql odpowie jak „????” symbole, twój zestaw znaków (mam nadzieję, że UTF-8) naprawdę polecam:
lub za pomocą stylu procedury
mysqli_set_charset($db,"utf8")
źródło