MySQL karakterkészlet illesztési hiba
2021-06-09T12:46:55+02:00
2021-06-16T10:06:34+02:00
2022-08-12T03:20:31+02:00
krisztian999tr
Sziasztok!
Fejlesztettünk a saját szerverünkön egy webalkalmazást. Azonban amikor feltelepítettük azt az Ügyfél webszerverére, valamiért elszállt a karakterkészlet. 
A MySQL karakterkészlete a mi szerverünkön utf8_hungarian_ci volt és az ügyfél webszerverén is erre állítottuk át.  A weboldalon a statikus részekkel nincsen semmi baj és ott van a 
<meta charset="utf-8">
is. 

Ha a phpMyAdmin-ban átirok bármilyen adatot akkor jól jelenik meg. utána ott is és az oldalon is, viszont ha az admin felületen belül a PHP küld az SQL-nek egy Insert vagy Update utasítást akkor így jelenik meg pl. a Gyártók:



GyĂĄrtĂłk



 
Mi lehet a probléma?
Mutasd a teljes hozzászólást!
Megoldódott:

A HTML formon a következő kell:

accept-charset="UTF-8">
A PHP-ban az SQL-nek küldött inputhoz, pedig a változók beolvasásánál:

mb_internal_encoding($string);
Mutasd a teljes hozzászólást!

  • Mi lehet a probléma?

    Nézd meg ezeket:

    Az adatbázisnál illetve adattáblánál mi van alapértelmezett karakterkódolásnak beállítva?
    Ha nem megfelelő, akkor állítsd át.

    A mysql szerverhez csatlakozás után nem állítod-e be a karakter készletet direktben?
    pl.
    - mysqli_set_charset
    - vagy közvetlen SQL paranccsal: SET NAMES ...

    Ha nincs ilyen beállítás, akkor állítsd be az UTF-8-at
    pl. SQL parancs: SET NAMES 'utf8';

    Esetleg a kiküldött SQL parancs előtt nincs-e valamilyen karakter konverzió, ami "elrontja"?

    A "utf8_hungarian_ci" nem az adattábla karakterkódolása, ez csak az indexelésre (rendezés) vonatkozik.
    Mutasd a teljes hozzászólást!
  • Hali!

    A "utf8_hungarian_ci" nem az adattábla karakterkódolása, ez csak az indexelésre (rendezés) vonatkozik.

    Csak egy kis pontosítás: a COLLATION (kb. egyeztetés) azt határozza meg, hogy karakteres adatokat miként hasonlítson össze. Értelemszerűen, így a rendezésnél is szerepe van (hiszen a rendezés során is összehasonlítások történnek), azonban nem csak ott van jelentősége, hanem pl. egy egyszerű egyezőség-vizsgálatnál is, mondjuk egy WHERE-záradékban.

    Jelen esetben az utf8_hungarian_ci egyeztetés arról rendelkezik, hogy UTF-8 karakterkészlettel, magyar szabályok szerint (pl. az 'a' és az 'á' azonos értékű), kis- és nagybetűk közti különbséget nem figyelve (cicase-insensitive) történjen karakteres adatok közötti összehasonlítás.

    Mutasd a teljes hozzászólást!
  • Sajnos egyik sem működik. Ezeket próbáltam már (set names, set_charset)
    Ha a PhpMyAdminban írom át ékezetes betűkre (a táblában) akkor jól jelenik meg ott is és az oldalon is. Ha az oldal admin felületen módosít akkor nem jó.
    Mutasd a teljes hozzászólást!
  • Szia,

    A következő parancsok outputját kellene összehasonlítani a két rendszer között az érintett adatbázisokra és táblákra:

    show create database adatbázisnév; show create table táblanév;
    Mutasd a teljes hozzászólást!
  • Az lenne az igazi, ha a 'jó' és 'nem jó' helyett nekiállnál a módszeres hibakeresésnek. Kezdetnek meg lehetne nézni, hogy volt-e már itt a prog.hu-n hasonló kérdés, és ha igen, ajánlottak-e bennük valamiféle segítséget a hibakereséshez.
    Mutasd a teljes hozzászólást!
  • Igen. Teszteltem ezt :

    <?php $mysqli = new mysqli("localhost","my_user","my_password","my_db"); if ($mysqli -> connect_errno) { echo "Failed to connect to MySQL: " . $mysqli -> connect_error; exit(); } echo "Initial character set is: " . $mysqli -> character_set_name(); // Change character set to utf8 $mysqli -> set_charset("utf8"); echo "Current character set is: " . $mysqli -> character_set_name(); $mysqli -> close(); ?>

    És a válasz:
    Initial character set is: utf8
    Current character set is: utf8
    Mutasd a teljes hozzászólást!
  • Első: 

    CREATE DATABASE `xyz` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_hungarian_ci */
    Második:

    CREATE TABLE `playAdmin_users` ( `user_id` varchar(255) COLLATE utf8_hungarian_ci NOT NULL, `username` varchar(255) COLLATE utf8_hungarian_ci NOT NULL, `user_email` varchar(255) COLLATE utf8_hungarian_ci NOT NULL, `user_firstname` varchar(255) COLLATE utf8_hungarian_ci NOT NULL, `user_lastname` varchar(255) COLLATE utf8_hungarian_ci NOT NULL, `user_permission` int(15) NOT NULL, `user_lastlogin` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `user_approved` int(15) NOT NULL, `user_email_approved` int(15) NOT NULL, `user_password_hash` varchar(255) COLLATE utf8_hungarian_ci NOT NULL, `user_email_verify` varchar(255) COLLATE utf8_hungarian_ci NOT NULL, `user_session` varchar(255) COLLATE utf8_hungarian_ci NOT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci
    Mutasd a teljes hozzászólást!
  • Megoldódott:

    A HTML formon a következő kell:

    accept-charset="UTF-8">
    A PHP-ban az SQL-nek küldött inputhoz, pedig a változók beolvasásánál:

    mb_internal_encoding($string);
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd