Heim > Datenbank > MySQL-Tutorial > MySQL整型数据溢出的处理策略_MySQL

MySQL整型数据溢出的处理策略_MySQL

WBOY
Freigeben: 2016-06-01 13:14:39
Original
1159 Leute haben es durchsucht

作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

今天接到一个朋友电话说是觉的数据库被别人更改了,出现数据不对的问题 。经过很久的排查是数据类型溢出了(发生问题的版本是MySQL 5.1)。后来通过给朋友那边把MySQL 5.1升级到MySQL 5.5去解决这个问题。 这也让我有兴趣去了解一下MySQL不同版本数据类型溢出的处理机制。

先看一下MySQL支持的整型数及大小,存储空间:

Type Storage Minimum Value Maximum Value 存储大小
(Bytes) (Signed/Unsigned) (Signed/Unsigned) byte
TINYINT 1 -128 127 1 byte
0 255
SMALLINT 2 -32768 32767 2 bytes
0 65535
MEDIUMINT 3 -8388608 8388607 3 bytes
0 16777215
INT 4 -2147483648 2147483647 4 bytes
0 4294967295
BIGINT 8 -9223372036854775808 9223372036854775807 8 bytes
0 18446744073709551615

另外请记着mysql的数据处理会转成bigint处理,所以这里就用bigint几个测试:

SELECT CAST(0 AS UNSIGNED) - 1; SELECT 9223372036854775807 + 1;
Nach dem Login kopieren

MySQL 5.1 下:

mysql> SELECT CAST(0 AS UNSIGNED) - 1;+-------------------------+| CAST(0 AS UNSIGNED) - 1 |+-------------------------+|18446744073709551615 |+-------------------------+1 ROW IN SET (0.01 sec) mysql> SELECT 9223372036854775807 + 1;+-------------------------+| 9223372036854775807 + 1 |+-------------------------+|-9223372036854775808 |+-------------------------+1 ROW IN SET (0.01 sec)
Nach dem Login kopieren

MySQL 5.5, 5.6, 5.7下:

mysql> SELECT CAST(0 AS UNSIGNED) - 1;ERROR 1690 (22003): BIGINT UNSIGNED VALUE IS OUT OF range IN '(cast(0 as unsigned) - 1)'mysql> mysql> mysql> mysql> SELECT 9223372036854775807 + 1;ERROR 1690 (22003): BIGINT VALUE IS OUT OF range IN '(9223372036854775807 + 1)'
Nach dem Login kopieren

所在处理这类数据是一定要小心溢出(如早期有做弊冲Q币就是利用这个方法处理)

这个问题有可能会出现积分消息,积分相加, 或是一些钱相关的业务中出现, 主库5.1 ,从库MySQL 5.5情况也会出现不同步的问题。
建议:这类业务系统尽可能的升级到MySQL 5.5后版本

更多详情参考: http://dev.mysql.com/doc/refman/5.7/en/out-of-range-and-overflow.html

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage