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

MySQL จัดการโอเวอร์โฟลว์ระหว่างการประเมินนิพจน์ตัวเลขอย่างไร


ดังที่เราทราบดีว่า MySQL จะทำให้เกิดข้อผิดพลาดหากล้นระหว่างการประเมินนิพจน์ตัวเลข ตัวอย่างเช่น BIGNT ที่มีลายเซ็นที่ใหญ่ที่สุดคือ 9223372036854775807 ดังนั้นนิพจน์ต่อไปนี้จะทำให้เกิดข้อผิดพลาด -

mysql> Select 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807+1)'

MySQL สามารถจัดการกับโอเวอร์โฟลว์ประเภทนี้ได้ด้วยวิธีต่อไปนี้:

โดยการแปลงค่าเป็นค่าที่ไม่ได้ลงนาม

MySQL เปิดใช้งานการดำเนินการดังกล่าวโดยแปลงค่าเป็น unsigned ดังนี้ -

mysql> Select CAST(9223372036854775807 AS UNSIGNED) +1;
+------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) +1 |
+------------------------------------------+
|                      9223372036854775808 |
+------------------------------------------+
1 row in set (0.07 sec)

โดยการใช้เลขคณิตที่แน่นอน

MySQL สามารถใช้เลขคณิตค่าที่แน่นอนเพื่อจัดการกับนิพจน์ก่อนหน้า เป็นเพราะโอเวอร์โฟลว์เกิดขึ้นขึ้นอยู่กับช่วงของตัวถูกดำเนินการ ตัวอย่างเช่น การคำนวณข้างต้นสามารถทำได้โดยใช้ค่า DECIMAL ดังนี้ −

mysql> Select 9223372036854775807.0 + 1;
+---------------------------+
| 9223372036854775807.0 + 1 |
+---------------------------+
|     9223372036854775808.0 |
+---------------------------+
1 row in set (0.01 sec)