MySQL不容忽视SQL_MODE的设置

CREATE DATABASE  db_test;

CREATE TABLE `tb1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增id‘,
  `rank` int(10) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘排名‘,
  `add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘当前时间‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO tb1(rank, type, add_time) VALUES(19, 1, ‘2015-03-01‘);
INSERT INTO tb1(rank, type, add_time) VALUES(10, 1, ‘2015-04-01‘);
INSERT INTO tb1(rank, type, add_time) VALUES(12, 1, ‘2015-05-01‘);

SELECT A.add_time, A.rank, B.add_time, B.rank, (B.rank - A.rank) AS diff
FROM tb1 A LEFT JOIN tb1 B ON A.type = B.type
WHERE A.add_time=‘2015-03-01‘ AND B.add_time = ‘2015-04-01‘;

#报错消息
#[Err] 1690 - BIGINT UNSIGNED value is out of range in ‘(`db_test`.`b`.`rank` - `db_test`.`a`.`rank`)‘

#解决方式:
SET sql_mode=‘NO_UNSIGNED_SUBTRACTION‘;
SELECT A.add_time, A.rank, B.add_time, B.rank, (B.rank - A.rank) AS diff
FROM tb1 A LEFT JOIN tb1 B ON A.type = B.type
WHERE A.add_time=‘2015-03-01‘ AND B.add_time = ‘2015-04-01‘;

#这样diff的值可以使负数了,具体sql_mode的用法请参考
  http://tech.it168.com/a2012/0822/1388/000001388401.shtml

时间: 2024-10-10 23:21:08

MySQL不容忽视SQL_MODE的设置的相关文章

mysql的sql_mode合理设置

MySQL的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题   sql_mode常用值如下: ONLY_FULL_GROUP_BY: 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中 NO_AU

MySQL的sql_mode模式说明及设置

MySQL的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题. sql model 常用来解决下面几类问题 (1) 通过设置sql mode, 可以完成不同严格程度的数据校验,有效地保障数据准备性. (2) 通过设置sql model 为宽松模式,来保证大多数sql符合标准的sql语法,这样

MySQL的sql_mode解析与设置

https://blog.csdn.net/hhq163/article/details/54140286 https://blog.csdn.net/ccccalculator/article/details/70432123 升级mysql后,居然使用错误.更新时候提示timestamp类型错误,提示无默认值错误 原来是mysql提升了安全措施,原来的0000-00-00不被允许了,默认值也必须收购设置了 需要更改一下,但尚未找到快速更改的方法,只好先更改mysql设置了: 一.查看 sql

MySQL的SQL_MODE模式

1. sql_mode模式 mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode: mysql> select @@sql_mode; +----------------------------------------------------------------+ | @@sql_mode                                                  

mysql5.6.20数据库sql_mode模式设置

开发需求要求通过php后台程序导入数据到mysql的某个库的表中,但是报错:Incorrect integer value: '' for column 'id' at row 1.同时自己在mysql5.6的数据库的这个表中insert into 一条数据,insert into log values('','admin','31','002t'),还是报错出现上面同样的错误. 于是网上百度找到解决办法: 参考资料:http://blog.csdn.net/j2eelamp/article/d

mysql中为int设置长度究竟是什么意思

根据个人的实验并结合资料:1.长度跟可以使用的值的范围无关,值的范围仅跟类型对应的存储字节数和是否unsigned有关:2.长度指的是显示宽度,比如,指定3位int,那么id为3和id为300的值,在显示的时候怎么对齐呢?按照手册的说法,是默认用“空格”在左边填充.比如下述表格 CREATE TABLE `inttest` ( `id` int(3) unsigned NOT NULL AUTO_INCREMENT, `value` varchar(2) NOT NULL, PRIMARY KE

mysql的安装、C++访问mysql数据库、编码设置问题

一.mysql的安装,这个相对简单,直接去官网下载mysql安装程序,就可以完成安装过程,网上有很多安装教程,这个没什么注意事项. 二.C++访问mysql,主要是用到mysql定义的头文件,内部定义了各种数据结构和函数,比如MYSQL,MYSQL_RES,MYSQL_ROW,mysql_real_connect等等一系列的结构和函数.这里要注意的就是将头文件及lib文件以及dll文件配置到当前开发环境来进行访问mysql数据库. 以最新的vs2013作为示例说一下配置过程.为了写的清晰点,在网

如何设置mysql远程访问及防火墙设置

笔者在一个实际的项目中需要MYSQL远程访问. 情景: 安装好Mysql, 本地访问正常,很奇怪局域的机器都无法访问该服务器上的MYSQL数据库. 经过资料查找 原来Mysql默认是不可以通过远程机器访问的,通过下面的配置可以开启远程访问 . 在MySQL Server端: 登陆MYSQL   ..bin\ mysql -h localhost -u root -p 提示你输入密码,输入密码后进入 mysql 命令模式, mysql> use mysql;    mysql> GRANT AL

关于mysql的wait_timeout参数 设置不生效的问题【转】

关于wait_timeout 有一次去online set wait_timeout 的时候发现改了不生效,如下: mysql> show variables like 'wait_timeout';+---------------+-------+| Variable_name | Value |+---------------+-------+| wait_timeout | 100 |+---------------+-------+1 row in set (0.00 sec) mysq