Jump to content
php.lv forumi

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


Leotard

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
Link to comment
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.. 

 

 

Link to comment
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.

Link to comment
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!

Link to comment
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

Link to comment
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

Link to comment
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.

Link to comment
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.

Link to comment
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
Link to comment
Share on other sites

  • Leotard changed the title to SOLVED - Kā pareizi sašķirot latviešu tekstu par spīti MySQL gļukiem?

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...