W Javie zdaję String
do PHP.
W PHP biorę ten ciąg i szukam go za pomocą MySQL
pytanie.
Oto kod php:
$query = $database->escape_value(trim($_POST["query"]));
$result = mysqli_query($dbconnection, Data::getSearchQuery($query));
while ($row = mysqli_fetch_assoc($result)) {
$output[] = $row;
}
print(json_encode($output));
mysqli_close($dbconnection);
public static function getSearchQuery($item_query) {
$query = "
SELECT i.item, i.item_id, c.category, c.cat_id
FROM items as i
LEFT JOIN master_cat AS c
ON (c.cat_id = i.cat_id)
WHERE i.item LIKE "%{$item_query}%"
ORDER BY i.item ASC;";
return $query;
}
To zawsze działa, jeśli używam zwykłych znaków na klawiaturze w USA. Ale w momencie, gdy zacznę używać nieregularnych znaków, wyszukiwanie staje się puste.
Mogę to zweryfikować MySQL
przechowuje dane W PODSTAWIE UŻYTKOWNIKA. Więc jeśli napisali Beyoncè
, w ten sposób baza danych ją przechowuje.
Ale kiedy szukam Beyoncè
(lub cokolwiek) w powyższym kodzie, zwraca puste.
Jak mam radzić sobie z char. kodowanie tutaj?
Odpowiedzi:
1 dla odpowiedzi № 1Trzy kwestie do przemyślenia:
1) $item_query
zmienna może mieć niepoprawne kodowanie.
2) >>Mogę zweryfikować, czy MySQL przechowuje dane, JAK UŻYTKOWNIK WPROWADZI SIĘ
To może być trudne. Jeśli ktoś zapisuje łańcuch zakodowany w iso8859-1 w bazie danych utf-8, łańcuch jest oczywiście nieprawidłowo przechowywany. Jeśli ten ciąg zostanie odczytany za pomocą klienta (tj. Narzędzia wiersza polecenia phpmyadmin lub mysql) skonfigurowanego na iso8859-1, ciąg zostanie poprawnie zwrócony - chociaż jego reprezentacja w bazie danych jest wyraźnie nieprawidłowa.
3) Ustawienia MySql: Czy masz ustawiony utf-8 dla samego połączenia? Co z zestawami znaków i zestawieniami dla bazy danych / tabeli?
https://dev.mysql.com/doc/refman/5.5/en/charset-syntax.html
AKTUALIZACJA: Zakładam, że chcesz, aby wszystko było utf-8. Rodzaj szybkiego hacka do przetestowania:
Beyoncé
ma 7 znaków (patrz funkcja MySQL CHAR_LENGTH)- w utf-8 zajmuje 8 bajtów (patrz funkcja DŁUGOŚĆ MySQL). Osiem bajtów jest reprezentowanych przez kodowanie jednobajtowe na znak, takie jak Windows-1252, coś w tym stylu
Beyoncé
.
Prowadzi to do następujących testów diagnostycznych ...
Wydana przez PHP komenda SQL
"SELECT CHAR_LENGTH($item_query), LENGTH($item_query);"
powinien następnie zwrócić wynik (7, 8), aby nam to pokazać zmienna $ item_query jest prawdopodobnie poprawnie zakodowana, a baza danych lubi utf-8. (7, 7) oznaczałoby $ item_query wasn "t utf-8, a (8, 8) oznaczałoby, że baza danych jeszcze nie chce zajmować się utf-8. Jeśli tak jest w drugim przypadku, być może wydaje się
SET NAMES "UTF8";
przed zapytaniem.Podobnie polecenie SQL wydane przez PHP
SELECT CHAR_LENGTH("Beyoncé"), LENGTH("Beyoncé");
powinien zwrócić wynik (7, 8), aby nam to pokazać twój edytor PHP jest skonfigurowany do edycji plików php utf-8.
Powtórz poprzedni krok z phpmyadmin (lub dowolnym klientem SQL), aby się upewnić ten klient używa utf-8, zbyt.
Jeszcze żaden stół nie był zaangażowany! Polecenie SQL
SELECT CHAR_LENGTH(somecolumn), LENGTH(somecolumn) FROM sometable;
(z czasem kodowaniem znaków utf-8 i kolumną zawierającą niektóre znaki diakrytyczne) powinien powiedzieć, czy utf-8 był używany do przechowywania wartości w tabeli.
Jeśli wszystkie poprzednie testy przeszły pomyślnie, sprawdź ponownie za pomocą LIKE. Parzysty
"Beyoncé" LIKE "Beyonce"
powinien więc działać. Aby uzyskać więcej informacji, zestawienie Google MySQL.