/ / Obsługa kodowania znaków z Java na PHP na MySQL - Java, PHP, MySQL, kodowanie znaków

Obsługa kodowania znaków z Java na PHP do MySQL - java, php, mysql, kodowanie znaków

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 № 1

Trzy 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 ...

  1. 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.

  2. 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.

  3. Powtórz poprzedni krok z phpmyadmin (lub dowolnym klientem SQL), aby się upewnić ten klient używa utf-8, zbyt.

  4. 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.

  5. 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.