DEV Community

Cover image for Database Collation ใน PostgreSQL
iconnext for ใดๆในโลกล้วน Postgres

Posted on • Edited on

Database Collation ใน PostgreSQL

Collation คือ

Collation คือชุดกฎที่กำหนดวิธีการเปรียบเทียบและจัดเรียงข้อมูลประเภทข้อความในฐานข้อมูล โดยมีความสำคัญอย่างยิ่งในการจัดการข้อมูลที่เกี่ยวข้องกับภาษาและวัฒนธรรมที่แตกต่างกัน
โดยมีวัตถุประสงค์หลัก 3 ประการ ดังนี้:

1. การเปรียบเทียบข้อมูล: ช่วยให้เปรียบเทียบข้อมูลระหว่างชุดข้อมูลต่างๆ ได้อย่างถูกต้อง แม่นยำ
2. การเรียงลำดับข้อมูล: ช่วยให้เรียงลำดับข้อมูลตามเกณฑ์ต่างๆ เช่น ลำดับตัวอักษร ลำดับตัวเลข หรือวันที่
3. การค้นหาข้อมูล: ช่วยให้ค้นหาข้อมูลที่ต้องการได้รวดเร็วและง่ายดาย

Collation ภาษาไทยใน PostgreSQL

PostgreSQL รองรับ Collation หลากหลายภาษา รวมถึงภาษาไทย โดย Collation ภาษาไทยที่นิยมใช้ ได้แก่

  • th-TH-unicode: Collation นี้ใช้ Unicode เป็นมาตรฐานในการเปรียบเทียบและเรียงลำดับข้อมูล เหมาะสำหรับการใช้งานทั่วไป
  • th-TH-TIS620: Collation นี้ใช้มาตรฐาน TIS620 เป็นมาตรฐานในการเปรียบเทียบและเรียงลำดับข้อมูล เหมาะสำหรับการใช้งานกับระบบเก่า
  • th-TH-dict: Collation นี้ใช้พจนานุกรมไทยเป็นมาตรฐานในการเปรียบเทียบและเรียงลำดับข้อมูล เหมาะสำหรับการใช้งานที่ต้องการเรียงลำดับตามหลักภาษาไทยอย่างเคร่งครัด

การตั้งค่า Collation

ใน Postgres เราสามารถกำหนด Collation ได้ในระดับ Database, Table, Column โดย

  1. ในระดับ Database สามารถกำหนดผ่านคำสั่ง
CREATE DATABASE [ชื่อฐานข้อมูล] COLLATE th-TH-unicode; 
Enter fullscreen mode Exit fullscreen mode
  1. ในระดับ Table
CREATE TABLE [ชื่อตาราง] ( name VARCHAR(255) COLLATE th-TH-unicode ); 
Enter fullscreen mode Exit fullscreen mode
  1. ในระดับ Column
ALTER TABLE [ชื่อตาราง] ALTER COLUMN [ชื่อคอลัมถ์] SET COLLATE th-TH-unicode; 
Enter fullscreen mode Exit fullscreen mode
  1. การใช้งานค้นหาโดยกำหนด
SELECT * FROM mytable ORDER BY name COLLATE th-TH-unicode; 
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างการใช้งาน

เพื่อให้เห็นภาพในการใช้งาน Collation ที่เกี่ยวกับการค้นหาจึงขอยกตัวอย่างเป็นภาษาไทยเนื่องจากเป็นบทความภาษาไทย
ตัวอย่างการใช้งาน Collation ภาษาไทยใน PostgreSQL
1.th-TH-x-icu

-- สร้างตารางทดสอบ CREATE TABLE thai_words ( word VARCHAR(50) COLLATE "th-TH-x-icu" ); -- เพิ่มข้อมูลทดสอบ INSERT INTO thai_words (word) VALUES ('กข'), ('ขก'), ('คำ'), ('งู'), ('จาน'), ('ฉลาม'), ('ชา'), ('ซุป'), ('ญาติ'); -- ทดสอบการเรียงลำดับ SELECT * FROM thai_words ORDER BY word; 
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์

word ---- กข ขก คำ งู จาน ฉลาม ชา ซุป ญาติ 
Enter fullscreen mode Exit fullscreen mode

คำอธิบาย: th-TH-x-icu จะเรียงลำดับตามพจนานุกรมภาษาไทย โดยใช้มาตรฐาน ICU ซึ่งรองรับการเรียงลำดับที่ซับซ้อนของภาษาไทยได้ดี

2.th-TH

-- สร้างตารางทดสอบ CREATE TABLE thai_names ( name VARCHAR(50) COLLATE "th-TH" ); -- เพิ่มข้อมูลทดสอบ INSERT INTO thai_names (name) VALUES ('สมชาย'), ('สมหญิง'), ('สมศรี'), ('สมศักดิ์'), ('สมบัติ'); -- ทดสอบการเรียงลำดับ SELECT * FROM thai_names ORDER BY name; 
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์:

name ---- สมชาย สมบัติ สมศรี สมศักดิ์ สมหญิง 
Enter fullscreen mode Exit fullscreen mode

คำอธิบาย: th-TH จะเรียงลำดับตามมาตรฐานทั่วไปของภาษาไทย แต่อาจไม่ละเอียดเท่า th-TH-x-icu ในบางกรณี

3.th_TH.utf8

-- สร้างตารางทดสอบ CREATE TABLE thai_food ( food VARCHAR(50) COLLATE "th_TH.utf8" ); -- เพิ่มข้อมูลทดสอบ INSERT INTO thai_food (food) VALUES ('ต้มยำ'), ('ผัดไทย'), ('แกงเขียวหวาน'), ('ส้มตำ'), ('ต้มข่าไก่'); -- ทดสอบการเรียงลำดับ SELECT * FROM thai_food ORDER BY food; 
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์:

food ---- แกงเขียวหวาน ต้มข่าไก่ ต้มยำ ผัดไทย ส้มตำ 
Enter fullscreen mode Exit fullscreen mode

คำอธิบาย: th_TH.utf8 จะเรียงลำดับตามมาตรฐาน UTF-8 ซึ่งรองรับอักขระพิเศษในภาษาไทยได้ดี

4.การเปรียบเทียบระหว่าง Collation

-- สร้างตารางทดสอบ CREATE TABLE compare_collations ( word_icu VARCHAR(50) COLLATE "th-TH-x-icu", word_th VARCHAR(50) COLLATE "th-TH", word_utf8 VARCHAR(50) COLLATE "th_TH.utf8" ); -- เพิ่มข้อมูลทดสอบ INSERT INTO compare_collations VALUES ('เก่ง', 'เก่ง', 'เก่ง'), ('เกง', 'เกง', 'เกง'), ('เก๋ง', 'เก๋ง', 'เก๋ง'); -- ทดสอบการเรียงลำดับด้วย Collation ต่างๆ SELECT 'ICU' AS collation_type, word_icu AS word FROM compare_collations ORDER BY word_icu UNION ALL SELECT 'TH' AS collation_type, word_th AS word FROM compare_collations ORDER BY word_th UNION ALL SELECT 'UTF8' AS collation_type, word_utf8 AS word FROM compare_collations ORDER BY word_utf8; 
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์อาจแตกต่างกันเล็กน้อยขึ้นอยู่กับเวอร์ชันของ PostgreSQL และการตั้งค่าระบบ แต่โดยทั่วไปจะเห็นความแตกต่างในการจัดเรียงระหว่าง Collation ต่างๆ
คำอธิบาย: ตัวอย่างนี้แสดงให้เห็นว่า Collation ที่ต่างกันอาจให้ผลการเรียงลำดับที่แตกต่างกัน โดยเฉพาะเมื่อเกี่ยวข้องกับวรรณยุกต์และอักขระพิเศษในภาษาไทย
การเลือกใช้ Collation ที่เหมาะสมขึ้นอยู่กับความต้องการเฉพาะของแอปพลิเคชันของคุณ และอาจต้องทดสอบกับข้อมูลจริงเพื่อให้แน่ใจว่าได้ผลลัพธ์ตามที่ต้องการ

Top comments (0)