Re: utf8_unicode_ci collation in mysql + DUCET

26 views
Skip to first unread message

Anon Sricharoenchai

unread,
May 16, 2008, 3:46:17 AM5/16/08
to thai-linux...@googlegroups.com
ไม่มีใครตอบ ..........
...

พอดีว่ามันมีประเด็นการ sort ของ MediaWiki อยู่ที่
http://www.mediawiki.org/wiki/Bugzilla/collation_by_locale
https://bugzilla.wikimedia.org/show_bug.cgi?id=164
จึงได้มาศึกษาเรื่องนี้.

On 4/29/08, Anon Sricharoenchai <anon...@gmail.com> wrote:
> มันมี utf8_general_ci, utf8_unicode_ci, utf8_bin, ...
>
> 1. unicode collation นี้ หมายถึงว่า sort ได้ทุกภาษาพร้อมๆ กันหรือเปล่าครับ?

เพิ่งทราบว่ามันมีสิ่งที่เรียกว่า DUCET (Default Unicode Collation
Element Table http://unicode.org/unicode/reports/tr10/
http://en.wikipedia.org/wiki/Unicode_collation_algorithm )

> 2. utf8_unicode_ci ใน mysql 5.0.22 ไม่เห็นจะ sort ภาษาไทยได้

แสดงว่า mysql ยังไม่ได้ใช้ DUCET

> 3. libc locale มี unicode collation หรือไม่? เห็นมีแต่ th_TH.UTF-8,
> xx_XX.UTF-8, แยกเป็นภาษาๆ ไป, แต่ไม่มี unicode.UTF-8
>

http://demo.icu-project.org/icu-bin/locexp?_=en_US&d_=en&x=col
^^^ เท่าที่ลองกับ demo ของ icu นี้, ขนาดว่า locale เป็น en_US มันก็ยัง
sort ภาษาไทยได้ถูกต้องอยู่เลย.

ในขณะที่บน libc6 นั้น, en_US.UTF-8 มันจะไม่ sort ภาษาไทย.
ในทางกลับกัน th_TH.UTF-8 บน libc6 ก็จะไม่ sort พวก accent/diacritic ของ latin1.
คือ libc6 จะ sort ได้ทีละภาษา (จริงๆ ต้องเรียกว่า "script" ไม่ใช่ "ภาษา").

http://demo.icu-project.org/icu-bin/locexp?_=th_TH&d_=en&x=col
^^^ กลับมาลอง locale th_TH บน icu มันก็ยัง sort ตาม diacritic ของ
latin1 ได้ถูกต้องอีก

แสดงว่า icu จะคล้ายกับว่าใช้ DUCET อยู่แล้ว. (แต่ libc6 ยังไม่ได้ใช้ DUCET?)
โดยที่แต่ละ script ก็จะมี default collation อยู่แล้ว.
เช่น
* latin script (อักษร latin) มี default collation เป็น en
* thai script (อักษร thai) มี default collation เป็น th

* locale en_US กับ fr_FR จะกำหนด collation สำหรับ latin script เป็นแบบ
en กับ fr ตามลำดับ, แต่ไม่ได้กำหนด collation สำหรับ script อื่น
* locale th_TH กำหนด collation สำหรับ thai script ไว้เป็น th,
และไม่ได้กำหนด collation สำหรับ script อื่น

ดังนั้น ใน icu,
* เมื่อใช้ locale fr_FR มันก็จะใช้ collation fr สำหรับ latin script,
แต่เมื่อเจอ thai script ก็จะใช้ default collation ของ thai script คือ
th
* เมื่อใช้ locale th_TH มันก็จะใช้ collation th สำหรับ thai script,
แต่เมื่อเจอ latin script ก็จะใช้ default collation ของ latin script
คือ en

* en_US --> collation = en + th + ...
* fr_FR --> collation = fr + th + ...
* th_TH --> collation = en + th + ...

(หลายคนในที่นี้อาจจะทราบสิ่งเหล่านี้อยู่แล้วก็ได้, แต่ผมเพิ่งทราบครับ)

Theppitak Karoonboonyanan

unread,
May 16, 2008, 5:10:10 AM5/16/08
to thai-linux...@googlegroups.com
2008/5/16 Anon Sricharoenchai <anon...@gmail.com>:

> ไม่มีใครตอบ ..........

ว่าจะตอบแต่ลืมครับ (หลายเรื่องเกิน ที่อยู่ใน TODO)

> On 4/29/08, Anon Sricharoenchai <anon...@gmail.com> wrote:
>> มันมี utf8_general_ci, utf8_unicode_ci, utf8_bin, ...
>>
>> 1. unicode collation นี้ หมายถึงว่า sort ได้ทุกภาษาพร้อมๆ กันหรือเปล่าครับ?
>
> เพิ่งทราบว่ามันมีสิ่งที่เรียกว่า DUCET (Default Unicode Collation
> Element Table http://unicode.org/unicode/reports/tr10/
> http://en.wikipedia.org/wiki/Unicode_collation_algorithm )

มีครับ ซึ่งข้อมูลจะ sync กับ ISO/IEC 14651

http://www.open-std.org/JTC1/SC22/WG20/docs/projects#14651

เดิมนั้น ข้อมูลภาษาไทย-ลาวได้เพิ่มเข้าไปใน draft ของ 14651 แล้ว
ยกเว้นการจัดการสระหน้า ซึ่งในขณะนั้น Unicode Collation Algorithm
กำหนดให้ใช้ preprocessing ในการ reorder

ล่าสุด เมื่อปี 2546 มีการติดต่อจาก ISO committee (Kent Karlsson)
ว่าจะเพิ่มชุด contraction เพื่อจัดการสระหน้าสำหรับภาษาไทย-ลาวด้วย
(เป็นวิธีที่ใช้ใน glibc locale) ซึ่งความคืบหน้าทาง ISO หลังจากให้
รายละเอียดเขาไปแล้ว ผมก็ไม่ได้ตาม มารู้อีกทีก็ตอนอ่าน UTS#10 ว่า
Unicode มี contraction ไทย-ลาวมาตั้งแต่ Unicode 4.1

>> 3. libc locale มี unicode collation หรือไม่? เห็นมีแต่ th_TH.UTF-8,
>> xx_XX.UTF-8, แยกเป็นภาษาๆ ไป, แต่ไม่มี unicode.UTF-8
>
> http://demo.icu-project.org/icu-bin/locexp?_=en_US&d_=en&x=col
> ^^^ เท่าที่ลองกับ demo ของ icu นี้, ขนาดว่า locale เป็น en_US มันก็ยัง
> sort ภาษาไทยได้ถูกต้องอยู่เลย.
>
> ในขณะที่บน libc6 นั้น, en_US.UTF-8 มันจะไม่ sort ภาษาไทย.
> ในทางกลับกัน th_TH.UTF-8 บน libc6 ก็จะไม่ sort พวก accent/diacritic ของ latin1.
> คือ libc6 จะ sort ได้ทีละภาษา (จริงๆ ต้องเรียกว่า "script" ไม่ใช่ "ภาษา").

มันควรจะ sort รวมกันได้ครับ โดยหลักการแล้ว เพียงแต่ glibc ยังใช้
ข้อมูลเก่าของ 14651 แล้วก็ใช้ customization ใน th_TH locale อยู่

เดี๋ยวคงต้องติดต่อ glibc ดูครับ


เทพ.
--
Theppitak Karoonboonyanan
http://linux.thai.net/~thep/

Reply all
Reply to author
Forward
0 new messages