Autor Zpráva
edenboy
Profil
Ahoj,

mám tabulku v mysql, kde je nastaveno kodování utf8 a způsob řazení utf8_czech_ci. Nedaří se mi záznamy správně seřadit. V tabulce je sloupec příjmení - když dám tabulku seřadit podle tohoto sloupce, jako první se mi objevuje záznam začínající Š pak Č, poté C...

K databázi se připojuju přes php skript, ale to řazení se chová úplně stejně i v případě že se připojím k serveru, kde běží mysql, přes putty. Informaci o nastavení kódování přes php neposílám. Nevím zda má nějaký význam, že stránka s webovým formulářem odkud data vkládám je také v utf8. Jinak pro ilustraci uvádím link na jinou tabulku z téže databáze, která ilustruje, jak to kódování funguje, resp. spíš nefunguje.

http://seminar.upv.cz/pokus/show.php

Set character set ani set names bohužel nepomohlo. Zkusil jsem i skript který vypsal tabulku ve všech možných variantách řazení v rámci utf8, ale ani v jednom případě se to neseřadilo správně. Když otevřu exportovaná data v notepadu++ v hexa módu, kódy znaků odpovídají skutečně UTF8 (podle http://cs.wikipedia.org/wiki/Unicode) - např. zmíněné Š je reprezentováno jako %C5%A0.
Kajman_
Profil *
Není to jen instalace s chybnými soubory určující porovnání? Na jiném serveru to zlobí také?
edenboy
Profil
Tak podle všeho se do databáze resp. tabulky ukládala data v ISO Latin1 ačkoliv tabulka měla nastaveno kódování utf8 a kolaci ut8_czech_ci. Když jsem si dal po připojení k mysql serveru vypsat proměnné, vypsalo mi to toto:

character_set_client: latin1
character_set_connection: latin1
character_set_database: utf8
character_set_filesystem: binary
character_set_results: latin1
character_set_system: utf8
character_sets_dir: usr/share/mysql/charsets

Mohu se ještě zeptat, která ze zmíněných proměnných má vliv na to, v jakém kódóvání se data do databáze uloží a která má vliv na to, v jakém kódování bude výstup příkazu select? Když jsem totiž nepoužíval "set names utf8" při insertu (což byla příčina chyby - meta tag na stránce s formulářem sám o sobě nestačí) výsledkem selektovacího skriptu (rovněž jsem tam nepoužíval set names), který generoval tabulku v html, byla data v utf8 (byť špatně řazená). Když se začala data po použití "set names utf8" vkládat správně a v selektovacím skriptu jsem set names nepoužil, zobrazovaly se mi místo českých znaků otazníky nebo čtverečky.

Jde mi tedy o to, proč výsledkem selectu dat v latin1 bez použití set names je utf8 a proč výsledkem selectu dat v utf8 bez použití set names jsou čtverečky a otazníky a jaký na to mají vliv zmíněné proměnné.
Kajman_
Profil *
Asi proto, že bez set names říkáte, že dáváte data v latin1 (což není pravda) a db stroj ví, že sloupečky u tabulky jsou v latin1, tak nic nepřevádí. Data jsou tedy nezměněná, ale v jiném kódování, než si mysql myslí, takže s tím budou jen problémy.

Když nastavíte utf8, ví db, že některé znaky, co vkládáte, v latin1 nejsou - ty nahradí otazníkem.

Sloupeček můžete převést na charset binary, pak na utf8. Tím se změní informace o kódování beze změny dat. Pak při set names utf8 by mělo být řazení ok.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: