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)之间时,它就认定你是一个非法数,超出了范围,然后会提示错误;当你用无符号数时,你传入的若是一个负数,则认定你传入的数也是一个非法数(亲测是这样),然后也会提示该错误。
解决方法:
由于存储过程没有无符号类型,所以在接受传入的值的时候,我们可以使用大范围的数进行接收,比如这里我将smallint类型改为了int,就能正常运行了。
个人理解:
我个人觉得,mysql里面在数值方面并没有特别注意类型这个概念,而只是关心的是范围,我们设定了类型,其实就是设定了范围,当我们传入一个数字,如果在这个范围内,我们就认定是这个类型的。当然这是我个人的看法,只是为了方便理解。如果有什么问题的话,希望大家多提建议。
相关文章
- (转)Amoeba for MySQL 非常好用的mysql集群软件
- MySQL 日期时间相关函数整理
- yum安装mysql
- 【MySQL进阶-04】深入理解mysql事务本质(超级详解)
- mysql5.5版本和mysql 5.6版本具体有哪些区别?
- 项目访问mysql时报: Failed to obtain JDBC Connection...:Host ‘X‘is not allowed to connect to this MySQL ser
- Mysql 5.7源码编译启动 报error问题:The server quit without updating PID file (/data/data_mysql/mysql.pid).
- MySQL运维之---mysqldump备份、select...into outfile、mysql -e 等工具的使用
- 有关Mysql的mysql_store_result函数返回NULL的情况以及其他注意事项
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- Spring Boot应用连接数据库MySQL、及一个简单的demo
- Mysql在项目中相关使用(简单操作数据库)
- dubbo(soa分布式)与cobar(mysql分布式)
- mysql Access denied for user 'root'@'localhost' (using password: YES)
- 【转】MySQL Utilities,mysql工具包
- mysql-数据库的主从同步,实现读写分离
- MySQL - MySQL 8.0进阶操作:JSON