mysql有符号数_mysql下有符号数和⽆符号数的相关问题最近⾃⼰的程序在调⽤mysql的存储过程传参给smallint类型变量的时候,总是出现out of range value的错误,刚开始⽤C数值转换⽅式的⼆进制位转换思路来思考时,总是觉得没什么问题,因为我的数确实在16位⼆进制数下能保存,但是后来才发现,原来mysql并不是按照这种⼆进制转换的⽅式。
先附上mysql各个整数类型的取值范围:
bigint
从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储⼤⼩为 8 个字节。
P.S. bigint已经有长度了,在mysql建表中的length,只是⽤于显⽰的位数
int
从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。存储⼤⼩为 4 个字节。int 的 SQL-92 同义字为integer。
smallint
从 -2^15 (-32,768) 到 2^15 – 1 (32,767) 的整型数据。存储⼤⼩为 2 个字节。
tinyint
从 0 到 255 的整型数据。存储⼤⼩为 1 字节。
因为所要调⽤的存储过程主要是为了实现insert操作,⽽和这个存储过程中smallint类型的变量对应的表中栏位是⼀个⽆符号smallint,由于mysql存储过程是没有⽆符号这种类型,所以只好在存储过程接受时⽤smallint接收,当时猜想mysql可能和C语⾔中⼀样应该会⾃动对有符号数进⾏⽆符号数转换。
可是并不是这样,当我传⼊参数64000(在⽆符号bigint内不在有符号bigint内),mysql会提⽰错误out of range value,意思是超出了取值范围。在不断的测试之后,我发现mysql并不会像常⽤的编程语⾔的机制那样,会⾃动将有符号数转换为⽆符号数,当判断你不在有符号数(此处是-32768-32767)或者⽆符号数(0-65535)之间时,它就认定你是⼀个⾮法数,超出了范围,然后会提⽰错误;当你⽤⽆符号数时,你传⼊的若是⼀个负数,则认定你传⼊的数也是⼀个⾮法数(亲测是这样),然后也会提⽰该错误。
mysql存储过程使用解决⽅法:
由于存储过程没有⽆符号类型,所以在接受传⼊的值的时候,我们可以使⽤⼤范围的数进⾏接收,⽐如这⾥我将smallint类型改为了int,就能正常运⾏了。
个⼈理解:
我个⼈觉得,mysql⾥⾯在数值⽅⾯并没有特别注意类型这个概念,⽽只是关⼼的是范围,我们设定了类型,其实就是设定了范围,当我们传⼊⼀个数字,如果在这个范围内,我们就认定是这个类型的。当然这是我个⼈的看法,只是为了⽅便理解。如果有什么问题的话,希望⼤家多提建议。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论