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

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

?>

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

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

Privacy Preferences

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
Manage Consent Preferences
  • คุกกี้ที่จำเป็น
    Always Active

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้

  • คุกกี้เพื่อการวิเคราะห์

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

  • คุกกี้เพื่อปรับเนื้อหาให้เข้ากับกลุ่มเป้าหมาย

    คุกกี้ประเภทนี้จะเก็บข้อมูลต่าง ๆ รวมทั้งข้อมูลวส่วนบบุคลเกี่ยวกับตัวคุณเพื่อเราสามารถนำมาวิเคราะห์ และนำเสนอเนื้อหา ให้ตรงกับความเหมาะสมกับความสนใจของคุณ ถ้าหากคุณไม่ยินยอมเราจะไม่สามารถนำเสนอเนื้อหาและโฆษณาได้ไม่ตรงกับความสนใจของคุณ

บันทึก