MariaDB JSON + Thai
Tags: mariadb, json, thai
Published: 2020-11-11 01:00:55

---
title: MariaDB JSON + Thai
published: true
date: 2020-11-10 21:49:47 UTC
tags: mariadb,json,thai
canonical_url: 
---

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

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

![](https://cdn-images-1.medium.com/max/1024/1*DhtYtwXx88D-gZZW3pUvcA.png)<figcaption>VSCode MySQL Extension</figcaption>

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

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

[การเรียงข้อความภาษาไทยที่เข้ารหัสแบบ UTF-8 ใน MariaDB](https://medium.com/@pruet/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%87%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B9%80%E0%B8%82%E0%B9%89%E0%B8%B2%E0%B8%A3%E0%B8%AB%E0%B8%B1%E0%B8%AA%E0%B9%81%E0%B8%9A%E0%B8%9A-utf-8-%E0%B9%83%E0%B8%99-mariadb-8f824ef79d59)

ซึ่งปัจจุบันเราสามารถใช้ \*\_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

#### ตัวอย่าง

![](https://cdn-images-1.medium.com/max/955/1*ieq0ccvaX2s7bHu7iBkvJA.png)<figcaption>สร้าง 2 tables</figcaption>

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

![](https://cdn-images-1.medium.com/max/745/1*JrIbroN-lGcJDmnwUesdug.png)

![](https://cdn-images-1.medium.com/max/716/1*6nYYxQraaVlgWX4Lz4trVQ.png)

และลอง query ดู

![](https://cdn-images-1.medium.com/max/951/1*YIuAw5gg2puv2UymH2_MPA.png)<figcaption>ASC</figcaption>

![](https://cdn-images-1.medium.com/max/950/1*MyL_mxPf9KJMpz679Ty60g.png)<figcaption>ASC</figcaption>

![](https://cdn-images-1.medium.com/max/939/1*cEvQc7866st_VHBdc6IGLA.png)<figcaption>DESC</figcaption>

![](https://cdn-images-1.medium.com/max/948/1*QpZN15giKSRaaXdy4sUBHQ.png)<figcaption>DESC</figcaption>

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

### JSON

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

#### Field Type

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

![](https://cdn-images-1.medium.com/max/710/1*imccrilgQuKHmzRlDmAtxg.png)<figcaption>คำสั่งสร้าง</figcaption>

![](https://cdn-images-1.medium.com/max/1024/1*oriZbPiLErn9lIx7DLCA4g.png)<figcaption>หลังจากสร้างเสร็จแล้ว</figcaption>

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

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

![](https://cdn-images-1.medium.com/max/810/1*LMxWvlHYyXxFK9uikHGDNw.png)<figcaption>ตัวอย่างข้อมูล</figcaption>

#### Query

![](https://cdn-images-1.medium.com/max/1004/1*IQivESMxtnrmoc6p9pv5ow.png)<figcaption>ลอง sort แบบดิบๆ :P</figcaption>

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

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

![](https://cdn-images-1.medium.com/max/803/1*vIW2XNirZ2HeqeDFhwBMmw.png)

![](https://cdn-images-1.medium.com/max/706/1*tvl6KWAtQiHWwtmoG-W3cw.png)

#### Sort เบื้องต้น

![](https://cdn-images-1.medium.com/max/953/1*I3JBW99PT3B6h8YOX3IOXQ.png)<figcaption>เรียงปกติ</figcaption>

![](https://cdn-images-1.medium.com/max/691/1*QxXTs_M1ZR_4YcsdR2RBRQ.png)<figcaption>ผลไม่ตรง</figcaption>

![](https://cdn-images-1.medium.com/max/966/1*5NPkihpYz6AfVOYk3vmhUA.png)<figcaption>เรียงแบบใช้ utf8_thai_520_w2</figcaption>

![](https://cdn-images-1.medium.com/max/698/1*DQOpu3vEMHHvqoC0ZiniXQ.png)<figcaption>ผลสวยงาม</figcaption>

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

![](https://cdn-images-1.medium.com/max/1024/1*aZZ5Oh9MNMndMxbl_7Obeg.png)<figcaption>เรียงตาม th</figcaption>

![](https://cdn-images-1.medium.com/max/990/1*Zlq9utjFC2IzdyCv_oZXsw.png)<figcaption>ผล</figcaption>

![](https://cdn-images-1.medium.com/max/1024/1*_Q2Gh78rqG-P80KSfGZEhQ.png)<figcaption>เรียงตาม en</figcaption>

![](https://cdn-images-1.medium.com/max/994/1*cAJfrNY_F5EYdZ7pxSBL_g.png)<figcaption>ผล</figcaption>

#### Filter

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

![](https://cdn-images-1.medium.com/max/1024/1*_6rlNLfLCQeyg79TDzanAw.png)

![](https://cdn-images-1.medium.com/max/991/1*acocUCu6FUg6CrZ-PR7LfQ.png)

![](https://cdn-images-1.medium.com/max/993/1*_nOzFIXvMBeu8DU9sefgRA.png)

![](https://cdn-images-1.medium.com/max/946/1*aQxG71tRKr0onCZqQPNW0w.png)

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

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