คอลัมน์ LONGTEXT เก็บตัวเลขใหญ่ๆ เป็นสตริง การเรียงลำดับแบบปกติจะเป็น Lexicographic (เรียงตามตัวอักษร) ให้ผลผิด ต้องแปลงเป็นตัวเลขด้วย + 0 หรือ CAST
ตัวอย่างปัญหา
1. สร้างตาราง LONGTEXT
mysql> CREATE TABLE DemoTable (
Value LONGTEXT
);
Query OK, 0 rows affected (0.94 sec)
2. เพิ่มตัวเลขใหญ่ (เกิน BIGINT)
mysql> INSERT INTO DemoTable VALUES('778437437447488487476464644433334');
mysql> INSERT INTO DemoTable VALUES('9998888485775775757577578585');
mysql> INSERT INTO DemoTable VALUES('8888874757757757757757575675656');
mysql> INSERT INTO DemoTable VALUES('988757757574646');
3. เรียงลำดับแบบ String (ผิด)
mysql> SELECT * FROM DemoTable ORDER BY Value; +-----------------------------------+ | Value | +-----------------------------------+ | 778437437447488487476464644433334 | -- เริ่ม 7 | 8888874757757757757757575675656 | -- เริ่ม 8 | 988757757574646 | -- เริ่ม 9 แต่สั้นกว่า | 9998888485775775757577578585 | -- เริ่ม 9 +-----------------------------------+
4. เรียงลำดับแบบ Number: ใช้ Value + 0
mysql> SELECT * FROM DemoTable ORDER BY Value + 0;
5. ผลลัพธ์ที่ถูกต้อง (ตัวเลขน้อยไปมาก)
+-----------------------------------+ | Value | +-----------------------------------+ | 988757757574646 | -- น้อยที่สุด | 9998888485775775757577578585 | | 8888874757757757757757575675656 | | 778437437447488487476464644433334 | -- มากที่สุด +-----------------------------------+
วิธีแปลงชนิดข้อมูล (Type Casting)
| วิธี | ตัวอย่าง | หมายเหตุ |
|---|---|---|
col + 0 | ORDER BY Value + 0 | สั้นที่สุด MySQL จะแปลงเป็น DOUBLE |
CAST(col AS UNSIGNED) | ORDER BY CAST(Value AS UNSIGNED) | ชัดเจนกว่า จำกัดที่ 64-bit |
CAST(col AS DECIMAL(65,0)) | ORDER BY CAST(Value AS DECIMAL(65,0)) | รองรับตัวเลขใหญ่สุด (65 digits) |
⚠️ ข้อจำกัด
UNSIGNED(BIGINT) จำกัดที่ 18446744073709551615 (~1.8e19)- ตัวเลขในตัวอย่าง > BIGINT ต้องใช้
DECIMALหรือ+ 0(กลายเป็น DOUBLE ประมาณ 1e308) DOUBLEมี Precision ประมาณ 15-17 ตัวเลข ถูกต้องสำหรับการเรียงลำดับ แต่ไม่แม่นยำสำหรับการคำนวณ
สรุป
ใช้ ORDER BY Value + 0 หรือ CAST(Value AS DECIMAL(65,0)) เพื่อเรียงลำดับ LONGTEXT/VARCHAR ที่เก็บตัวเลขใหญ่ ให้ถูกต้องตามค่านิยมตัวเลข ไม่ใช่ลำดับตัวอักษร