DEV Community

MrChoke
MrChoke

Posted on • Originally published at Medium on

MariaDB JSON + Thai

บันทึกการเก็บ JSON ใน MariaDB และ ภาษาไทย

ผมทดสอบโดยใช้ MariaDB 10.5.7 ผ่าน Docker Container โดยใช้ VSCode Extension ชื่อว่า MySQL by cweijan ช่วยในการ Query และ จับหน้าจอนะครับ

VSCode MySQL Extension

การเรียงลำดับภาษาไทย

สำหรับการ Sort ภาษาไทยบน MariaDB นั้น อ.พฤษภ์ บุญมา ได้เขียนอธิบายไว้แบบชัดเจนแล้วที่

การเรียงข้อความภาษาไทยที่เข้ารหัสแบบ UTF-8 ใน MariaDB

ซึ่งปัจจุบันเราสามารถใช้ *_thai_520_w2 กับ unicode แบบต่างๆ ที่ MariaDB Suport เช่น

  • utf8_thai_520_w2
  • utf8mb4_thai_520_w2
  • ucs2_thai_520_w2
  • utf16_thai_520_w2
  • utf32_thai_520_w2

ตัวอย่าง

สร้าง 2 tables

ผมสร้าง 2 ตารางแบบ general_ci ซึ่งส่วนใหญ่มักเป็นค่าเริ่มต้น กับ thai_520_w2 และผมลอง insert ข้อมูลตามที่ อ.พฤษภ์ เขียนไว้

และลอง query ดู

ASC

ASC

DESC

DESC

เป็นอันว่ามันใช้ได้จริงๆ สวยงามพร้อมรับประทานมาก

JSON

มาดู JSON กันบ้าง MariaDB สนับสนุน JSON มาสักพักหนึ่งแล้ว แต่อาจจะไม่เท่าทางฝั่ง PostgreSQL และโดยรายละเอียดบางอย่างก็ไม่เหมือนกับ MySQL ทั้งหมดผมก็ไม่แม่นเพราะเพิ่มหัดใช้เหมือนกันซึ่งก็ยกตัวอย่างตามที่ใช้ดังนี้

Field Type

เราสามารถใช้ shortcut JSON กับ MariaDB ได้เลยซึ่งเวลาเสร็จแล้วจะเป็นแบบนี้

คำสั่งสร้าง

หลังจากสร้างเสร็จแล้ว

จะเห็นว่า MariaDB จะใช้ LONGTEXT และ CHARSET utf8mb4 และ COLLATE utf8mb4_bin

Insert ตัวอย่างข้อมูล

ตัวอย่างข้อมูล

Query

ลอง sort แบบดิบๆ :P

ข้างบนลอง sort แบบมั่วๆ จากก้อน JSON ก็ดูเหมือนเกือบเรียงได้ เพราะข้างหน้ามีตัวอักษรเหมือนกันคือ { “th”: “ แต่ถ้าเราจะเรียงทางฝั่ง en บ้างละทำไง ? จริงๆ เท่าที่ค้นดูมันก็มีหลายทางออกนะ เช่นเอาแต่ละ path คือ th และ en แยกออกไปเก็บไว้ทำเป็น column ไว้ search และ sort โดยเฉพาะก็ได้ แต่ผมทดสอบแบบตรงไปตรงมากับ field JSON เลย

Query เฉพาะข้อความ

Sort เบื้องต้น

เรียงปกติ

ผลไม่ตรง

เรียงแบบใช้ utf8_thai_520_w2

ผลสวยงาม

ถ้าเราอยากเรียงตามภาษาเฉยๆ แต่จะเอา JSON ไปใช้เลยละ

เรียงตาม th

ผล

เรียงตาม en

ผล

Filter

ถ้าเราจะกรองละ

จากที่เคยลองผ่าน SQLAlchemy (python) ผมเจอปัญหาเรื่อง case-sensitive แต่ลองกับ RAW SQL แล้วสามารถ LIKE แบบ case-insensitive ได้เดี๋ยวต้องกลับไปดูอีกที

จริงๆ JSON ยังเล่นได้อีกหลายแบบผมบันทึกไว้เท่าที่เล่นแค่นี้ก่อนนะครับใครมีข้อเสนอแนะสามารถพูดคุยแลกเปลี่ยนกันได้เลยนะครับ

Top comments (0)