Jump to content
php.lv forumi
Sign in to follow this  
Leotard

SOLVED - Kā pareizi sašķirot latviešu tekstu par spīti MySQL gļukiem?

Recommended Posts

MySQL nekorekti strādā teksta šķirošana latviešu valodā. Proti, MySQL atsevišķos gadījumos neredz starpību starp burtiem ar un bez diakritiskajām zīmēm. Piemēram, normāli strādā šķirošana burtiem C/Č, taču burti A/Ā MySQL acīs ir absolūti vienādi. Rezultātā ORDER BY izdod ārā bezjēdzīgu fufeli. Rezultāts nemainās (tai ziņā, ka sviests vien sanāk), nomainot collation (gan dažādi UTF-8 varianti, gan cp1257) - viss viens. Daļējas sekmes ir izmantojot BINARY atslēgas vārdu, bet tik un tā miskaste vien sanāk, jo visi rezultāti ar diakritiskajām zīmēm aizlec uz saraksta galu (sākumā nāk vsi A-Z, tad visi Ā-Ž).

Jautājums  - kādi būtu ieteikumi problēmas risināšanai? Kā normāli sašķirot tekstu latviešu valodā?

Attēlā problēmas ilustrācija - burti C/Č šķirojas pareizi, bet burti A/Ā - nē (collation utf8_latvian_ci).

sort.png.c33bbb7edb47ca2bf3a91a2ca99c7902.png

Edited by Leotard

Share this post


Link to post
Share on other sites

utf8_unicode_ci vai utf8mb4_unicode_ci  collation.

Share this post


Link to post
Share on other sites

Ja SQLs ir uz tava servera, tad ir iespēja izveidot savu kārtošanas algoritmu..  tur ir faili, kas nodrošina katra kodējuma kārtošanu - secību .
šī nav tikai LV problēma, un "fiksi" ir atrodami.. 
bet teorētiski "UTF8_.... Latvian.."  vajadzētu strādāt korekti.. 

 

 

Share this post


Link to post
Share on other sites
8 hours ago, Faks said:

utf8_unicode_ci vai utf8mb4_unicode_ci  collation.

Hehe! Nein!

utf8_unicode_ci vai utf8mb4_unicode_ci šķiro ignorējot diakritiskās zīmes.

utf_latvian_ci vai utf8mb4_latvian_ci šķiro daļēji pareizi, kā bildē - C/Č ir pareizi, A/Ā ir nepareizi.

Share this post


Link to post
Share on other sites
4 hours ago, Grey_Wolf said:

Ja SQLs ir uz tava servera, tad ir iespēja izveidot savu kārtošanas algoritmu..  tur ir faili, kas nodrošina katra kodējuma kārtošanu - secību .
šī nav tikai LV problēma, un "fiksi" ir atrodami.. 
bet teorētiski "UTF8_.... Latvian.."  vajadzētu strādāt korekti.. 

 

 

!Yess! Tu vari, lūdzams, dot kādu norādi, kur tos kodējuma secības failus meklēt?

Jā, lasu, ka arī skandināvi ar to mokās.

Teorētiski jā (utf_latvian_ci, utf8mb4_latvian_ci), bet... bet praksē pffft!

Share this post


Link to post
Share on other sites

Ja tev būs utf_latvian tad meklējot pēc c netiks atrasti č. Ja būs unicode, tad c un č būs viens un tas pats chars

Paskaties te http://collation-charts.org/mysql60/mysql604.utf8_latvian_ci.html

Ja tev ir utf_latvian, tad vajadzētu būt ka kārtošana nav OK tikai pēc a, ā un u, ū. Ar pārējiem burtiem kārtošanai jābūt kārtībā. Dod zināt vai tā ir, pašam negribās tagad testēt :D

Share this post


Link to post
Share on other sites
On 2/12/2019 at 4:18 PM, Kasspars said:

Ja tev būs utf_latvian tad meklējot pēc c netiks atrasti č. Ja būs unicode, tad c un č būs viens un tas pats chars

Paskaties te http://collation-charts.org/mysql60/mysql604.utf8_latvian_ci.html

Ja tev ir utf_latvian, tad vajadzētu būt ka kārtošana nav OK tikai pēc a, ā un u, ū. Ar pārējiem burtiem kārtošanai jābūt kārtībā. Dod zināt vai tā ir, pašam negribās tagad testēt :D

Hei! Nu, lūk. Patiesība ir vēl interesantāka. Izskatās, ka kārtošana ir Ok visiem līdzskaņiem, bet nestrādā nevienam patskanim.

Sazin ko te var darīt...

Collation utf8mb4_latvian_ci :

 

utf8mb4_latvian_ci.png

Share this post


Link to post
Share on other sites

varijants ir atver source uz C un pierkasti savu algoritmu uz sortesanu un sakompile kopa savu libary un aida.

Share this post


Link to post
Share on other sites
37 minutes ago, Faks said:

varijants ir atver source uz C un pierkasti savu algoritmu uz sortesanu un sakompile kopa savu libary un aida.

Tad jau vienkāršāka ir sortēšanas lauku taisīšana - kurā saglabā pārveidoto tekstu: "pakāpe" -> "pa0ka1pe0". Tiesa, ir algoritmi, kas mazāk vietas prasa.

Share this post


Link to post
Share on other sites
11 hours ago, e-remit said:

Tad jau vienkāršāka ir sortēšanas lauku taisīšana - kurā saglabā pārveidoto tekstu: "pakāpe" -> "pa0ka1pe0". Tiesa, ir algoritmi, kas mazāk vietas prasa.

true nevaru nepiekrist.

Share this post


Link to post
Share on other sites
On 2/14/2019 at 8:45 PM, e-remit said:

Tad jau vienkāršāka ir sortēšanas lauku taisīšana - kurā saglabā pārveidoto tekstu: "pakāpe" -> "pa0ka1pe0". Tiesa, ir algoritmi, kas mazāk vietas prasa.

Yess! Paldies par ideju! Izskatās, ka strādā (skat. bildi). Varētu būt praksē vienkāršākais risinājums. Uztaisīšu trigeri, kurš uz INSERT un UPDATE izrēķina zortēšanas lauka vērtību un šķirošu pēc tā.

MySQL ļautiņiem vajadzētu aiziet tuksnesī un pārdomāt dzīvi - kā var pieļaut tik kliedzošus defektus. Latviskais collation pat nespēj A no Ā atšķirt. Kaunējušies būtu!

Untitled.png

Edited by Leotard

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×