Database Collation ใน PostgreSQL
Tags: postgres, thai
Published: 2024-07-14 09:30:35

## 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 สามารถกำหนดผ่านคำสั่ง
```sql
CREATE DATABASE [ชื่อฐานข้อมูล] COLLATE th-TH-unicode;
```

2. ในระดับ Table
```sql
CREATE TABLE [ชื่อตาราง] (
  name VARCHAR(255) COLLATE th-TH-unicode
);
```

3. ในระดับ Column
```sql
ALTER TABLE [ชื่อตาราง]
  ALTER COLUMN [ชื่อคอลัมถ์] SET COLLATE th-TH-unicode;
```

 4. การใช้งานค้นหาโดยกำหนด 
```sql
SELECT * FROM mytable ORDER BY name COLLATE th-TH-unicode;
 ```

##ตัวอย่างการใช้งาน##
เพื่อให้เห็นภาพในการใช้งาน Collation ที่เกี่ยวกับการค้นหาจึงขอยกตัวอย่างเป็นภาษาไทยเนื่องจากเป็นบทความภาษาไทย
ตัวอย่างการใช้งาน Collation ภาษาไทยใน PostgreSQL
1.th-TH-x-icu
```sql
-- สร้างตารางทดสอบ
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
```sql
-- สร้างตารางทดสอบ
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
```sql
-- สร้างตารางทดสอบ
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
```sql
-- สร้างตารางทดสอบ
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 ที่เหมาะสมขึ้นอยู่กับความต้องการเฉพาะของแอปพลิเคชันของคุณ และอาจต้องทดสอบกับข้อมูลจริงเพื่อให้แน่ใจว่าได้ผลลัพธ์ตามที่ต้องการ