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 โดย
- ในระดับ Database สามารถกำหนดผ่านคำสั่ง
CREATE DATABASE [ชื่อฐานข้อมูล] COLLATE th-TH-unicode;
- ในระดับ Table
CREATE TABLE [ชื่อตาราง] (
name VARCHAR(255) COLLATE th-TH-unicode
);
- ในระดับ Column
ALTER TABLE [ชื่อตาราง]
ALTER COLUMN [ชื่อคอลัมถ์] SET COLLATE th-TH-unicode;
- การใช้งานค้นหาโดยกำหนด
SELECT * FROM mytable ORDER BY name COLLATE th-TH-unicode;
ตัวอย่างการใช้งาน
เพื่อให้เห็นภาพในการใช้งาน 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;
ผลลัพธ์
word
----
กข
ขก
คำ
งู
จาน
ฉลาม
ชา
ซุป
ญาติ
คำอธิบาย: 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;
ผลลัพธ์:
name
----
สมชาย
สมบัติ
สมศรี
สมศักดิ์
สมหญิง
คำอธิบาย: 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;
ผลลัพธ์:
food
----
แกงเขียวหวาน
ต้มข่าไก่
ต้มยำ
ผัดไทย
ส้มตำ
คำอธิบาย: 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;
ผลลัพธ์อาจแตกต่างกันเล็กน้อยขึ้นอยู่กับเวอร์ชันของ PostgreSQL และการตั้งค่าระบบ แต่โดยทั่วไปจะเห็นความแตกต่างในการจัดเรียงระหว่าง Collation ต่างๆ
คำอธิบาย: ตัวอย่างนี้แสดงให้เห็นว่า Collation ที่ต่างกันอาจให้ผลการเรียงลำดับที่แตกต่างกัน โดยเฉพาะเมื่อเกี่ยวข้องกับวรรณยุกต์และอักขระพิเศษในภาษาไทย
การเลือกใช้ Collation ที่เหมาะสมขึ้นอยู่กับความต้องการเฉพาะของแอปพลิเคชันของคุณ และอาจต้องทดสอบกับข้อมูลจริงเพื่อให้แน่ใจว่าได้ผลลัพธ์ตามที่ต้องการ
Top comments (0)