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

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 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.