ในฐานะ Senior Architect ที่ต้องออกแบบระบบฐานข้อมูลที่รองรับผู้ใช้งานหลากหลายภาษา การจัดการตัวอักษร (Character Encoding) โดยเฉพาะภาษาที่มีความซับซ้อนอย่างภาษาไทย ถือเป็นหัวใจสำคัญที่ไม่อาจมองข้ามได้ การที่ระบบสามารถจัดเก็บและเรียกใช้ข้อมูลภาษาไทยได้อย่างถูกต้อง ไม่ว่าจะมีการเว้นวรรค ตัวอักษรพิเศษ หรือการเข้ารหัสที่แตกต่างกัน ล้วนขึ้นอยู่กับความเข้าใจในระดับของฐานข้อมูล
บทความนี้จะเจาะลึกถึงหลักการและวิธีการที่ PostgreSQL จัดการกับตัวอักษรภาษาไทยได้อย่างมีประสิทธิภาพ โดยเน้นที่การใช้ฟังก์ชันเฉพาะเพื่อตรวจสอบความยาวของสตริงในระดับตัวอักษรและระดับไบต์ ซึ่งเป็นความรู้ที่จำเป็นสำหรับนักพัฒนาระดับสูง
→ ทำความเข้าใจ Character Encoding ใน PostgreSQL
PostgreSQL ถูกออกแบบมาเพื่อรองรับมาตรฐาน Unicode (UTF-8) โดยค่าเริ่มต้น ซึ่งเป็นมาตรฐานสากลที่สามารถเก็บข้อมูลตัวอักษรได้เกือบทุกภาษา รวมถึงภาษาไทย การที่ PostgreSQL เลือกใช้ UTF-8 ทำให้มั่นใจได้ว่าข้อมูลภาษาไทยจะไม่เกิดปัญหาการเพี้ยน (Mojibake) ในระหว่างการจัดเก็บและการเรียกใช้
→ ความแตกต่างระหว่าง LENGTH() และ OCTET_LENGTH()
สำหรับนักพัฒนาที่ต้องทำงานกับภาษาที่มีหลายไบต์ต่อตัวอักษร (Multi-byte characters) เช่น ภาษาไทย การเข้าใจความแตกต่างระหว่างฟังก์ชันวัดความยาวจึงสำคัญมาก:
LENGTH(string): ฟังก์ชันนี้จะนับจำนวนตัวอักษร (Character Count) ตามที่มนุษย์มองเห็น ซึ่งเหมาะสำหรับการนับคำหรือตัวอักษรทั่วไปOCTET_LENGTH(string): ฟังก์ชันนี้จะนับจำนวนไบต์ (Byte Count) ที่ใช้ในการจัดเก็บสตริงนั้น ๆ ในหน่วยความจำ ซึ่งมีประโยชน์อย่างยิ่งในการตรวจสอบประสิทธิภาพการจัดเก็บข้อมูลและการคำนวณพื้นที่จัดเก็บข้อมูล
→ ตัวอย่างการใช้งาน PostgreSQL เพื่อวัดความยาวตัวอักษรไทย
เราสามารถใช้คำสั่ง SQL เพื่อสร้างตารางทดสอบและเปรียบเทียบผลลัพธ์ระหว่างสองฟังก์ชันนี้ได้ ดังตัวอย่างโค้ดต่อไปนี้:
SQL
-- 1. สร้างตารางเพื่อทดสอบการจัดเก็บตัวอักษรภาษาไทย
CREATE TABLE character_test (
id SERIAL PRIMARY KEY,
thai_text TEXT
);
-- 2. แทรกข้อมูลตัวอักษรภาษาไทย
INSERT INTO character_test (thai_text) VALUES ('สวัสดี');
-- 3. เลือกข้อมูลและเปรียบเทียบความยาว
SELECT
thai_text,
LENGTH(thai_text) AS char_count, -- นับจำนวนตัวอักษร
OCTET_LENGTH(thai_text) AS byte_count -- นับจำนวนไบต์
FROM character_test;
-- 4. ลบข้อมูลตัวอย่าง
DROP TABLE character_test;
ผลลัพธ์ที่ได้: หากคุณรันโค้ดนี้ คุณจะเห็นว่าค่า char_count (จำนวนตัวอักษร) จะเป็น 7 (ส-ว-ั-ส-ดี) ในขณะที่ byte_count (จำนวนไบต์) จะมีค่าสูงกว่า ซึ่งยืนยันว่า PostgreSQL จัดเก็บตัวอักษรแต่ละตัวในรูปแบบหลายไบต์ตามมาตรฐาน UTF-8
→ บทสรุปและข้อควรระวังสำหรับ Senior Architect
การทำความเข้าใจความแตกต่างระหว่าง LENGTH() และ OCTET_LENGTH() ไม่ใช่แค่ความรู้พื้นฐาน แต่เป็นทักษะที่ช่วยให้เราสามารถออกแบบ Query ที่แม่นยำและมีประสิทธิภาพสูง เมื่อต้องจัดการกับข้อมูลภาษาไทยหรือภาษาที่มีการเข้ารหัสที่ซับซ้อน
ในฐานะสถาปนิกระบบ การกำหนดค่า Collation ที่เหมาะสมตั้งแต่ต้นโครงการ (เช่น การกำหนด Collation ที่รองรับภาษาไทย) จะช่วยให้มั่นใจได้ว่าการเปรียบเทียบข้อมูล (Comparison) และการจัดเรียงข้อมูล (Sorting) จะเป็นไปตามหลักภาษาศาสตร์อย่างถูกต้อง ไม่ใช่เพียงแค่การเรียงตามลำดับไบต์เท่านั้น