DEV Community

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

Posted on • Updated 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)