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

Jakub Vrána, Výuka, 1.6.2007, diskuse: 17 (nové: 0)

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)

Shark:

No jo ale B1 to zařadí mezi A9 a A10.

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;

ikona 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?

ikona Jakub Vrána OpenID:

Ano, použitím utf8_czech_ci.

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

ikona Jakub Vrána OpenID:

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á'

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.