Řazení národních znaků v MySQL
Školení, která pořádám
Pokud chceme v databázi řadit nebo porovnávat české znaky v kódování UTF-8, použijeme pochopitelně porovnávání utf8_czech_ci
, které např. správně řadí písmeno ch
. Jaké však použít kódování pro ostatní jazyky, pro které neexistuje vlastní způsob porovnávání? Samo se nabízí výchozí porovnávání utf8_general_ci
, nicméně v popisu porovnávání v MySQL dokumentaci se můžeme dočíst, že tento způsob porovnávání neřadí správně německý znak ß
a případné další znaky, které se při řazení expandují na délku více písmen. Pro univerzální řešení je tedy správnější použít porovnávání utf8_unicode_ci
, i když je o něco pomalejší.
Přijďte si o tomto tématu popovídat na školení Návrh a používání MySQL databáze.
Diskuse
coccyx:
a ako mysql zoraduje cislice? ak mam napr.
auto1
auto10
auto11
auto2
da sa nejak ovplivnit aby ich radil postupne? tj.:
auto1
auto2
auto10
auto11
DFly:
[coccyx]
cislice v poho, ale s tvym stringem nikdo nic neudela :-)
paranoiq:
[coccyx]
jedině v php pomocí natsort() a natcasesort()
Redy:
tohle jsem v dokumentaci mysql, zajimave reseni ale nevyresi to pokud je cislo uvnitr retezce musi byt pouze na konci
Another way of sorting a field containing both text and numbers such as this:
+------+
| code |
+------+
| A10 |
| A20 |
| A5 |
| A6 |
| A7 |
| A8 |
| A9 |
+------+
You can query like this:
mysql> select * from table order by length(code), code;
+------+
| code |
+------+
| A5 |
| A6 |
| A7 |
| A8 |
| A9 |
| A10 |
| A20 |
+------+
coccyx:
dik, ake jednoduche a elegantne ... :o)
Mastodont:
U mne to řadí správně ...
Shark:
To jako že B1 je správně zařazeno mezi A9 a A10?
Chtěl jsem poukázat na to, že řadí řetězce nejprve podle délky a pak stejně dlouhé podle abecedy. Pokud všechny abecedně řazené později (B po A) mají délku rovnou nebo vyšší než předchozí (A před B) pak je vše v pořádku. Běžně se to ale asi nestane.
Mastodont:
V tom případě je třeba řadit:
select * from table order by left(code,1), length(code), code;
Jan Havrda:
Pozor na utf8_czech_ci a utf8_slovak_ci ve fulltextu (prinejmensim u MySQL 4.1). Fulltextove vyhledavani pri pouziti techto narodnich kodovych stranek povazuje slova s diakritikou a bez jako odlisna, tj. dotaz "zehlicka" nenalezne vyraz "žehlička".
Pro fulltext pouzijte radeji utf8_general_ci.
Kodova stranka musi byt shodna pro vsechny casti fulltextoveho klice. Po zmene kodove stranky zavolejte REPAIR TABLE `table` QUICK, aby se obnovily indexy.
Další info o kódových stránkách v MySQL viz http://www.linuxsoft.cz/article.php?id_article=952
kjus:
Při použití utf8_unicode_ci se mi u abecedního řazení např. slovo žebrák řadí před slovo zedník, dá se to nějak ošetřit?
kjus:
Díky moc, funguje to.
Robert Gonda:
Osobne som testoval triedenie pre slovensky jazyk v MySQL 4 aj 5, ale s diaktritikou to je zle - nedokaze to spravne zoradit ani pri utf8_general_ci alebo utf8_slovak_ci. Mate s tymto niekto skusenost? Dakujem za kazdu odpoved.
Bury:
Zdravím,
mám datábázi všechno kódování databaze, tabulky, sloupce mám nastaveno na "utf8_czech_ci", a potřebuju dvakrát načíst z jedný tabulky jméno hráče a tyto dvě jména porovnat v php, nevíte nějakou funkci, která by si poradila s českým řazením?
díky za rady
Jakub Vrána :
Na některých systémech by to mohlo jít vhodným nastavením locales, ale osobně bych se snažil porovnání udělat už na straně databáze.
Maritn:
Ale neprestane pak fungovat vyhledavani?
Napriklad ze skusenosti vim, ze pak nefunguje napriklad like 'seda' nenajde 'šedá'
Diskuse je zrušena z důvodu spamu.