ใน MySQL เมื่อคอลัมน์เป็นชนิดข้อมูล VARCHAR/CHAR แต่เก็บค่าตัวเลข การใช้ ORDER BY column จะเรียงตามลำดับตัวอักษร (Lexicographical) ทำให้ '10' อยู่ก่อน '2' การคูณคอลัมน์ด้วย 1 (column*1) จะบังคับให้ MySQL แปลงค่าเป็นตัวเลข (Implicit Cast) ก่อนเรียงลำดับ
ตัวอย่างการใช้งาน
สร้างตารางเก็บ ID เป็น VARCHAR:
mysql> CREATE TABLE DemoTable1441 (Id VARCHAR(30));
เพิ่มข้อมูลตัวเลขเป็นข้อความ:
mysql> INSERT INTO DemoTable1441 VALUES ('301'), ('23'), ('345'), ('10'), ('38');
เรียงลำดับปกติ (ตามตัวอักษร):
mysql> SELECT * FROM DemoTable1441 ORDER BY Id; +------+ | Id | +------+ | 10 | | 23 | | 301 | | 345 | | 38 | +------+
เรียงลำดับด้วย Id*1 (แปลงเป็นตัวเลข):
mysql> SELECT * FROM DemoTable1441 ORDER BY Id*1; +------+ | Id | +------+ | 10 | | 23 | | 38 | | 301 | | 345 | +------+
วิธีทางเลือกที่ชัดเจนกว่า (Best Practice)
-- ใช้ CAST (มาตรฐาน SQL) ORDER BY CAST(Id AS UNSIGNED) -- ใช้ CONVERT (MySQL specific) ORDER BY CONVERT(Id, UNSIGNED INTEGER) -- หรือเปลี่ยนชนิดข้อมูลคอลัมน์เป็น INT (แนะนำมากที่สุด) ALTER TABLE DemoTable1441 MODIFY Id INT;
เปรียบเทียบวิธีต่างๆ
| วิธี | ข้อดี | ข้อเสีย |
|---|---|---|
| column*1 | สั้น, เร็ว | ไม่ชัดเจน, ไม่ใช่มาตรฐาน SQL |
| CAST(column AS UNSIGNED) | มาตรฐาน SQL, อ่านง่าย | ยาวกว่าเล็กน้อย |
| เปลี่ยนชนิดข้อมูล | ดีที่สุดสำหรับประสิทธิภาพและความถูกต้อง | ต้อง ALTER TABLE, อาจมีผลกระทบต่อแอปพลิเคชัน |
คำเตือน
- หากคอลัมน์มีค่าที่ไม่ใช่ตัวเลข (เช่น 'ABC') การคูณด้วย 1 จะได้ 0 → อาจเรียงผิดพลาด
- ควรทำความสะอาดข้อมูลหรือใช้ CAST พร้อม WHERE เพื่อกรองค่าที่เป็นตัวเลขเท่านั้น
- การใช้งานนี้เป็น "Trick" ไม่ใช่ Best Practice สำหรับ Production