Üdv!
Egy nagyon régi problémámhoz hasonló jött most elő, és sajnos ehhez egyáltalán nem értek.
Adott egy python + django applikáció, ami mögött egy mysql szerver található. Az adatbázisban semmilyen kódolás nem lett beállítva, default szinte teljesen.
Az őűŐŰ karakterek helyett mindenhol kérdőjelek jelennek meg, és ezt szeretném orvosolni.
Nagyjából 4- 5 tábláról van szó, de ha az adatbázis egészére meg lehet oldani, az még jobb.
Amit eddig próbáltam:
ALTER TABLE tablanev CONVERT TO CHARACTER SET utf8 COLLATE utf8_hungarian_ci
. Ez megoldja a problémát az újonnan felvitt rekordokhoz, de a régiek helyén kérdőjelek maradnak. Ha ráfrissitek a rekordra, szintén kérdőjelek maradnak. Igazából nem tudom, hogy ezek milyen típusú kérdőjelek (mármint tényleg kérdőjelek (#63), avagy még megvan az eredeti karakter (őúŐÚ, stb), csak rosszul jelennek meg).
select mezo from table
hatasara is kerdojelnek tunnek.
-----
Debian: 8.9
Mysql: 5.5.57
Python: 2.7.9
Django: 1.11.4
mysql> show session variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
Koszonom a valaszokat, hozzaszolasokat.
Hozzászólások
Tábla karakterkódolás mellett az egyes (text/string)mezők és az adatbázis karakterkódolása is utf8_* ?
Hogyan tudom megnézni?
Esetleg tudsz listázni karakterkódokat:
Akkor most tudom, hogy elvesztek, tul sok 0X3F van benne :- ).
Csinálnék egy dumpot, abban megnézném hogy milyenek a karakterek.
Ha nem jók akkor lehet sed-el a replace-t megcsinálni.
Van persze olyan szitu amikor sajnos újra be kell vinni az adatokat mert ha nem bírta tárolni akkor nem bírta tárolni...
Aztán a dumpot egy helyesen (kódolással) megcsinált adatbázisba vissza lehet rakni, tesztelni, kész.
--
Gábriel Ákos
Igen, dump- on en is gondolkoztam, hogy azt iconv- vel atkonvertalni, de a jelek szerint ott is rossz. A dump elejen amugy ez van:
.
MySQL-nél ne használt utf8-at, mert az nem rendes UTF-8 kódolás, hanem valami más, ami hasonlít az UTF-8-ra, de nem az.
Használj utf8mb4-et, az jobb, de az sem az igazi UTF-8.
https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
Magyar ékezetekről van szó gondolom, nem kell túlspirázni.
Beállít, kipróbál, go.
--
Gábriel Ákos
Ha user által felvitt tartalom (azaz nem a rendszer által kontrollált adat), akkor nem feltétlenül van benne csak magyar ékezet.
Az ilyen könnyelmű hozzáállások, miszerint "beállít, kipróbál, go", ahelyett, hogy átgondolná, és rendesen csinálná az ember (ami ugyanannyi beállítás, csak előtte van egy 10 perces "átgondol" fázis is) vezetnek oda, hogy igénytelenek a szoftverek, és az üzemeltetési környezetek.
mondjuk ilyen szempontból a MySQL egy förtelmes szoftver, mert az átgondolnál az ilyen apróságait elég alaposan kell ismerni.
Múltkor egy napot olvastam utána, hogyan kezelünk rendesen UTF-8-at MySQL alatt - és sikerült szmájlikat beszúrnom, meg ilyenek, de még mindig nem vagyok benne biztos, hogy minden korrekt...
Persze, hogy förtelmes, de azért ha már nekiül az ember és használja, akkor olvassa el a hozzá tartozó dokumentációt.
Bocs, de ha mar hozzanyul, akkor miert ne csinalna meg rendesen? (Valamint az is erdekes feltetelezes, hogy orokke csak magyar nevu ugyfelek lesznek.)
Kb pont az ilyenekbol lesznek a kodban a provizorikus kodreszletek, meg kesobb a techdebt sprintek.
Nyilvan nem lehet mindenhol a tokeletessegre torekedni (nincs ra ido, nem eri meg, etc), de itt most szo szerint harom plusz betuvel meg lehet elozni kesobbi gondokat...
Lehet, de amikor ez az adatbazis fel lett huzva, kizarolag angol kornyezetrol volt szo. Senki nem is tudott mas nyelven... .
Angol környezetben (még ha az emberek nem tudnak angolul), akkor is szükség lehet tárolni olyan szavakat például, hogy "Hódmezővásárhely" vagy "Jászfelsőszentgyörgy", ami lehet egy copy-paste eredménye.
Nem az eredeti felallasra gondoltam, hanem a mostani helyzetre.
Ugy ertettem, hogy ha mar kiadod a parancsot es konvertalod az egeszet, akkor nem biztos, hogy X formatum a tuti hosszabbtavon, hanem pl X{megharomkarakter}.