MySQL运维实战(4.9) SQL_MODE之NO_UNSIGNED_SUBTRACTION

俊达2年前技术文章831

在mysql数据库中,unsigned表示不存负数,如果unsigned类型的字段作运算,得到的结果为负数,SQL会报错。


mysql> create table t1(a tinyint unsigned);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(100);
Query OK, 1 row affected (0.01 sec)

mysql> select a-1 from t1;
+------+
| a-1  |
+------+
|   99 |
+------+
1 row in set (0.00 sec)


-- 默认情况下,unsigned数字参与到减法运算中,如果结果为负数,SQL会报错。
mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> select 1-a from t1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(1 - `test_sqlmode`.`t1`.`a`)'



在SQL_MODE中加入NO_UNSIGNED_SUBTRACTION后,运算结果可以为负数。

-- 设置NO_UNSIGNED_SUBTRACTION后,结果可以为负数
mysql> set sql_mode='NO_UNSIGNED_SUBTRACTION';
Query OK, 0 rows affected (0.01 sec)

mysql> select 1-a from t1;
+------+
| 1-a  |
+------+
|  -99 |
+------+
1 row in set (0.00 sec)




相关文章

MySQL运维实战(4.2) 关于SQL_MODE

早期mysql对一些不符合SQL标准的SQL语句和数据的容忍度比较高。mysql 5.7 修改了默认sql mode。系统从低版本升级或迁移到高版本时,需要经过全面的测试,避免影响程序的正常运行。5....

 MySQL运维实战(1.3)安装部署:源码编译安装

MySQL运维实战(1.3)安装部署:源码编译安装

源码编译安装通常不需要自己编译mysql源码,编译的mysql和二进制包的内容基本一致。当然有些时候可能会需要采用源码编译的方式安装,安装一些非标准版本的mysql安装一些社区的patch、bugfi...

MySQL运维实战(2.1) 登录失败次数太多导致主机被block的问题处理

参数max_connect_errorsMySQL有参数max_connect_errors,当一个主机尝试登录MySQL,失败的次数超过了max_connect_errors,则这个主机将无法登录到...

MySQL运维实战(4.5) SQL_MODE之NO_ZERO_DATE和NO_ZERO_IN_DATE

NO_ZERO_DATE:日期中不允许'0000-00-00'NO_ZERO_IN_DATE:日期中年、月或日不允许为0,如不允许'2021-00-01', '...

MySQL运维实战之备份和恢复(8.3)xtrabackup增量备份

xtrabackup支持增量备份。在做增量备份之前,需要先做一个全量备份。xtrabackup会基于innodb page的lsn号来判断是否需要备份一个page。如果page lsn大于上次备份的l...

MySQL运维实战(4.7) SQL_MODE之ANSI_QUOTES

默认情况下,mysql使用反引号(`)作为标识符的引号。使用mysql关键字作为表名、字段名会报语法错误,这时可以加上反引号( `),避免报错。设置ANSI_QUOTES后,使用双引号(")...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。