Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL เรียงลำดับ LONGTEXT เป็นตัวเลขด้วย +0 (Type Casting)

คอลัมน์ 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 + 0ORDER 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 ที่เก็บตัวเลขใหญ่ ให้ถูกต้องตามค่านิยมตัวเลข ไม่ใช่ลำดับตัวอักษร