11
Mar

วิธีการแก้ปัญหาภาษาไทยไม่เรียงลำดับตามพจนานุกรม

Category: Blog / 411 views

อรุณสวัสดิ์ยามเช้าครับผม อากาศยามเช้าวันนี้แจ่มใสดีนะครับ นอนตื่นเช้าทำให้สมองปลอดโปร่งจริงๆ วันนี้ผมเลยนำเทคนิคการเขียนโค้ดเว็บมาบอกต่อครับ … ไม่รู้ว่าจะมีคนสังเกตหรือเปล่าว่า เวลาทำเว็บแล้วดึงข้อมูลมาแสดง ถ้าเป็นข้อมูลภาษาไทย มันจะมีปัญหาเวลาจัดเรียงครับ เพราะแทนที่มันจะเรียงตามพจนานุกรม มันกลับเรียงแบบแปลกๆ เช่น กา ขา อา เก เข เอ แบบนี้หนะครับ (ในความจริงมันควรจะเป็น กา เก ขา เข อา เอ) ปัญหานี้ไม่ได้มีเฉพาะภาษาไทยนะครับ มันเป็นกับพวกตัวอักษร Non-latin อื่นๆด้วย

สาเหตุที่ทำให้การจัดเรียงไม่เป็นไปตามพจนานุกรมแบบที่เราคุ้นเคยนั่นก็เป็นเพราะว่า เราจัดเก็บข้อมูลแบบ UTF-8 ซึ่งการจัดเก็บข้อมูลแบบนี้จะพิจารณาสระด้วยครับ ต่างจากเว็บแบบเก่าๆที่เราจะจัดเก็บแบบ TIS620 เพราะถ้าเป็น TIS620 มันพิจารณาเฉพาะตัวอักษรครับ แต่จะทำยังไงดีละ? ในเมื่อฐานข้อมูลเราจัดเก็บแบบ UTF-8 ไปแล้ว (และผมก็แนะนำให้จัดเก็บแบบ UTF-8 ต่อไปครับ เพราะมันเป็นการเก็บข้อมูลแบบสากลแล้ว) ดังนั้น วิธีการแก้ปัญหาก็คือ เมื่อเอามาแสดงผลเราก็ “แปลง” ชุดตัวอักษร จาก UTF-8 ให้เป็น TIS 620 ครับ โดยใช้คำสั่ง CONVERT แค่นี้การเรียงลำดับก็จะเป็นไปตามพจนานุกรมแล้วครับ

query

ส่วนวิธีการดึงข้อมูลสำหรับคนที่ทำเว็บด้วย WordPress นั้นให้ดูตามภาพประกอบนะครับ ว่ามีการเขียนโค้ดอย่างไร และในโค้ดนี้ผมยังเพิ่มเทคนิคการจัดกลุ่มข้อมูลที่มาแสดงด้วยครับ เช่น ต้องการแสดงข้อมูลเซ็ต จ-ฉ เท่านั้น ก็ลองดูโค้ดแล้วพิจารณาตามนะครับ

<?php

$querystr = "
 SELECT $wpdb->posts.*
 FROM $wpdb->posts, $wpdb->postmeta
 WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
 AND $wpdb->postmeta.meta_key = 'position'
 AND $wpdb->posts.post_status = 'publish'
 AND $wpdb->posts.post_type = 'teacher'
 ORDER BY CONVERT($wpdb->posts.post_title USING tis620) ASC
 ";

$pageposts = $wpdb->get_results($querystr, OBJECT);

?>

ส่วนโค้ดตัวนี้เอาไว้แสดงข้อมูลเป็นช่วงข้อมูลครับ เช่นต้องการแสดงข้อมูล ก-จ | ช-ท อะไรทำนองนี้ มันก็มีปัญหาอีกนั่นแหล่ะครับ เพราะว่าภาษาไทยดันมีบางคำที่มีการใช้สระนำหน้า เราจึงต้องเพิ่มเงื่อนไขในการดึงข้อมูลอีก โดยใช้คำสั่งตามตัวอย่างด้านล่างครับ

query2

<?php
$querystr = "
 SELECT $wpdb->posts.*
 FROM $wpdb->posts, $wpdb->postmeta
 WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
 AND $wpdb->postmeta.meta_key = 'position'
 AND $wpdb->posts.post_status = 'publish'
 AND $wpdb->posts.post_type = 'teacher'
 AND ($wpdb->posts.post_title like '_ก%' and Left($wpdb->posts.post_title,1) in ('เ','แ','โ','ไ','ใ')
 OR $wpdb->posts.post_title like 'ก%'
 OR $wpdb->posts.post_title like '_ข%' and Left($wpdb->posts.post_title,1) in ('เ','แ','โ','ไ','ใ')
 OR $wpdb->posts.post_title like 'ข%'
 OR $wpdb->posts.post_title like '_ค%' and Left($wpdb->posts.post_title,1) in ('เ','แ','โ','ไ','ใ')
 OR $wpdb->posts.post_title like 'ค%'
 OR $wpdb->posts.post_title like '_ฆ%' and Left($wpdb->posts.post_title,1) in ('เ','แ','โ','ไ','ใ')
 OR $wpdb->posts.post_title like 'ฆ%'
 OR $wpdb->posts.post_title like '_ง%' and Left($wpdb->posts.post_title,1) in ('เ','แ','โ','ไ','ใ')
 OR $wpdb->posts.post_title like 'ง%'
 OR $wpdb->posts.post_title like '_จ%' and Left($wpdb->posts.post_title,1) in ('เ','แ','โ','ไ','ใ')
 OR $wpdb->posts.post_title like 'จ%'
 )
 ORDER BY CONVERT($wpdb->posts.post_title USING tis620) ASC

";

$pageposts = $wpdb->get_results($querystr, OBJECT);

?>

หวังว่าข้อมูลชุดนี้จะมีประโยชน์นะครับ


Phraisohn Siripool is a Graphic Designer and Website Developer. Contact Buksohn for Your Business Endeavours
ปิดโหมดสีเทา