utf8_unicode_ci และ utf8_general_ci ต่างกันยังไง

หลายๆคนอาจสงสัยนะครับว่า ทำไมต้องมีสองอันนี้ด้วย และ มันต่างกันยังไง โดยที่หลายๆคนก็ใช้กันมั่วไปหมด (ตาม default ของ database) และมันก็ใช้ได้ปกติเสียด้วย

จริงๆแล้วทั้ง utf8_unicode_ci และ utf8_general_ci มันคือ Collation ของฐานข้อมูลครับ ซึ่งถ้าเรารู้ว่าคำๆนี้มีความหมายว่าอะไร เราก็จะเข้าใจความหมายของ utf8_unicode_ci และ utf8_general_ci ทันที

Collation หมายถึง รูปแบบการจัดเรียงครับ ซึ่งถ้าเข้าใจตามนี้ก็จะรู้ได้ทันทีว่า ทั้ง utf8_unicode_ci และ utf8_general_ci จะต่างกันตอน "เรียงลำดับ" ครับ
utf8_general_ci
utf8_unicode_ci
ดูจากทั้งสองรูปจะเห็นว่า ทั้งสองแบบเมื่อสั่ง "เรียงลำดับ" แล้ว จะเห็นว่าให้ผลลัพท์ต่างกัน
general หมายถึงการเรียงลำดับตามรหัสอักขระ (ในภาษาอังกฤษ)
unicode จะเป็นการเรียงลำดับตามภาษาท้องถิ่น ถ้าเป็นภาษาไทยจะเรียงลำดับตามนี้ http://unicode.org/charts/PDF/U0E00.pdf ซึ่งจริงๆแล้วมันเหมาะกับการเรียงลำดับในภาษาอื่นที่ไม่ใช่ภาษาอังกฤษครับ ซึ่งมันจะเรียงลำดับได้ถูกต้องกว่า (จริงๆแล้วสำหรับผลลัพท์ในภาษาไทยอาจไม่ค่อยชัดเจนเท่าไรนัก มักใช้อันไหนก็ได้ แต่ถ้าเป็นในภาษาต่างประเทศอื่นๆจะมีผลมากทีเดียว)

ในด้าน Performance เนื่องจาก general เรียงลำดับตามรหัสอักขระปกติ ทำให้มันสามารถเรียงลำดับได้เร็วกว่า unicode ครับ ถ้าจะให้ผมแนะนำ สำหรับภาษาไทยผมแนะนำให้ใช้ general จะได้ประโยชน์ด้านความเร็วมากกว่า unicode

แถมให้อีกนิด
ci หมายถึง case insensitive แปลเป็นไทยว่า เรียงลำดับโดยไม่สนใจขนาดตัวอักษร (a และ A คือตัวเดียวกัน)
cs หมายถึง case sensitive ก็ตรงกันข้ามกับ ci A จะอยู่ก่อน a
bin หมายถึง binary หมายถึงเรียงลำดับตาม byte code
 
^