版权声明:声明:本文档能够转载,须署名原作者。 作者:无为 qq:490073687 周祥兴 zhou.xiangxing210@163.com https://blog.csdn.net/Rookie_CEO/article/details/32075225

昨天在存储过程中用了语句insert into a select from b。在应用中发现bigint字段插入到int字段的时候,数值被截断了。插入后已经不是所要的值。

由于存储过程中没实用到异常捕捉的处理。所以一開始并未发现错误。仅仅是在比对数据的时候才发现不正确。后来比对了两张表,才发现是字段类型不一样。

接下来就试着验证了一下(window下的測试环境)。

创建两张表

CREATE TABLE T_INT(id INT ,vname VARCHAR(20));
CREATE TABLE T_BIGINT(id BIGINT ,vname VARCHAR(40));

測试bigint插入到int:假设超过了int的最大值,则直接截成最大值power(2,31)-1。假设是直接在命令行下操作时。会有警告提示。

</pre><p></p><p></p><pre code_snippet_id="397037" snippet_file_name="blog_20140618_3_2598704" name="code" class="sql">INSERT INTO t_int(id,vname)VALUES(POWER(2,31),'0123456789abcdefghij');

SHOW WARNINGS;
1264 OUT of RANGE VALUE FOR COLUMN 'id' AT ROW 1; SELECT * FROM t_int;
SELECT POWER(2,31)
2147483648
2147483647

測试varchar(40)插入到varchar(20):相同也会直接依照字段最大值截取。命令行下会有警告抛出。

INSERT INTO t_int(id,vname)VALUES(POWER(2,31),'0123456789abcdefghij1');
SHOW WARNINGS;
1264 OUT of RANGE VALUE FOR COLUMN 'id' AT ROW 1;
1265 DATA truncated FOR COLUMN 'vname' AT ROW 1; id vname
2147483647 0123456789abcdefghij
2147483647 0123456789abcdefghij INSERT INTO T_BIGINT(id,vname)VALUES(POWER(2,31),'0123456789abcdefghij1');
INSERT INTO t_int SELECT * FROM t_bigint;

由于我用的是SQLyog,默认的模式是空,所以在这个上面调试的时候,就出问题了。在应用中出错。是由于我的url中没有指定client的sql_mode。

/*[17:15:32][  31 ms]*/ SHOW VARIABLES LIKE 'lower_case_table_names';
/*[17:15:32][ 0 ms]*/ SET NAMES 'utf8';
/*[17:15:32][ 0 ms]*/ SET sql_mode='';
/*[17:15:32][ 16 ms]*/ SHOW DATABASES;

在cmd下直接连接MySQL是不会有问题,由于我已经在配置文件里配置了sql_mode。

mysql> INSERT INTO t_int(id,vname)VALUES(POWER(2,31),'0123456789abcdefghij');
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql>
mysql> show variables like '%mode%';
+--------------------------+----------------------------------------------------
------------+
| Variable_name | Value
|
+--------------------------+----------------------------------------------------
------------+
| innodb_autoinc_lock_mode | 1
|
| slave_exec_mode | STRICT
|
| sql_mode | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_S
UBSTITUTION |
+--------------------------+----------------------------------------------------
------------+
3 rows in set (0.00 sec) mysql>

可是假设将insert语句封装到存储过程中,不会报错。仅仅会有有警告。

mysql> call PRO_INSERT();
Query OK, 1 row affected, 3 warnings (0.01 sec) mysql> select * from t_int;
+------------+----------------------+
| id | vname |
+------------+----------------------+
| 2147483647 | 0123456789abcdefghij |
| 2147483647 | 0123456789abcdefghij |
+------------+----------------------+
2 rows in set (0.00 sec) mysql> set sql_mode='STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec) mysql> call PRO_INSERT();
Query OK, 1 row affected, 3 warnings (0.03 sec) mysql> select * from t_int;
+------------+----------------------+
| id | vname |
+------------+----------------------+
| 2147483647 | 0123456789abcdefghij |
| 2147483647 | 0123456789abcdefghij |
| 2147483647 | 0123456789abcdefghij |
| 2147483647 | 0123456789abcdefghij |
+------------+----------------------+
4 rows in set (0.00 sec) mysql> show variables like '%mode%';
+--------------------------+-------------------+
| Variable_name | Value |
+--------------------------+-------------------+
| innodb_autoinc_lock_mode | 1 |
| slave_exec_mode | STRICT |
| sql_mode | STRICT_ALL_TABLES |
+--------------------------+-------------------+
3 rows in set (0.00 sec) mysql>

出问题的解决办法就是由于sql_mode。

还有就是我没有异常处理机制。

下一篇先贴一下sql_mode.

解决方式,直接抛错。在存储过程中SET sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';(昨天晚听课时叶总提醒。在存储过程中set sql_mode)

mysql> call PRO_INSERT();
Query OK, 1 row affected, 3 warnings (0.01 sec) mysql> show warnings;
+---------+------+---------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'id' at row 1 |
| Warning | 1264 | Out of range value for column 'id' at row 2 |
| Warning | 1265 | Data truncated for column 'vname' at row 2 |
+---------+------+---------------------------------------------+
3 rows in set (0.00 sec) mysql> call PRO_INSERT();
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql>

存储过程

DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `PRO_INSERT`$$

CREATE DEFINER=`root`@`%` PROCEDURE `PRO_INSERT`()
BEGIN
SET sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
INSERT INTO t_int(id,vname)VALUES(POWER(2,31),'0123456789abcdefghij');
INSERT INTO t_int(id,vname)VALUES(POWER(2,31),'0123456789abcdefghij1');
END$$ DELIMITER ;

[MySQL学习]STRICT_ALL_TABLES相应的OUT of RANGE VALUE FOR COLUMN和DATA truncated FOR COLUMN的更多相关文章

  1. mysql Out of range value adjusted for column导致Warning(1265)Data truncated for column 'column_name' at row 1

    今天下午,我们的一个开发来找我,说线上有个环境报了"Warning(1265)Data truncated for column 'column_name' at row 1",定 ...

  2. mysql中出现的Data truncated for column

    mysql中想一个数据库中插入一条记录时,有可能因为好多原因,会出现Data truncated for column XXXXX的错误,这是因为你的数据类型的长度不一致导致的,仔细查看一下数据类型的 ...

  3. mysql出现Data truncated for column

    1.首先叙述,描述你自己的问题. 假设你想把同意为空值的勾去掉.. .恰巧数据库中的数据 processed_f 为空没有值. . . .这时候你对数据表结构做更改的时候就会出现Data trunca ...

  4. MySQL中 Data truncated for column 'xxx'解决方法

    DATA truncated FOR COLUMN 'description' AT ROW 1 1.错误再现 表中存在null字段 此时,修改表中某字段为主键 2.解决方法 不允许数据库中出现nul ...

  5. mysql 由decimal 引起的 Warning: Data truncated for column

    今天在使用python 库mysqldb的rawsql的时候遇到一个问题(其实并不是mysqlbean引起的) cls.raw_sql('update {table} set available_am ...

  6. Mysql load data infile 导入数据出现:Data truncated for column

    [1]Mysql load data infile 导入数据出现:Data truncated for column .... 可能原因分析: (1)数据库表对应字段类型长度不够或修改为其他数据类型( ...

  7. mysql导入文件出现Data truncated for column 'xxx' at row 1的原因

    mysql导入文件的时候很容易出现"Data truncated for column 'xxx' at row x",其中字符串里的xxx和x是指具体的列和行数. 有时候,这是因 ...

  8. [Mysql]由Data truncated for column联想到的sql_mode配置

    系统日志中出现了 ata truncated for column 'agent' at row 1 mysql出现这个问题的原因,无非就是字符集设置 或者是 字段过长导致的. mysql在初始化的时 ...

  9. Mysql导入数据时-data truncated for column..

    在导入Mysql数据库时,发现怎么也导入不进去数据,报错: 查看表定义结构:可以看到comm 定义类型为double类型 原来是因为数据库文件中: 7369    smith    clerk     ...

随机推荐

  1. [Luogu 3787] 冰精冻西瓜

    Description 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质, ...

  2. Linux tar 命令用法

    tar 命令可以为linux的文件和目录创建档案.利用 tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar 最初被用来在磁带上创建档案,现在,用户 ...

  3. JS截取字符串substr 和 substring方法的区别

    substr 方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参数 stringvar 必选项.要提取子字符串的字符串文字或 ...

  4. jquery 获得下拉框的值《转》

    获取Select : 获取select 选中的 text : $("#ddlRegType").find("option:selected").text(); ...

  5. 微信小程序顶部(navigationBar)设置为透明

    我记得在微信小程序中导航栏的颜色可以在app.json.  window里面添加navigationBarBackgroundColor属性,但是颜色只能为纯色.不能使用rgb,或者rgba的色号. ...

  6. Angular基础(七) HTTP & Routing

    ​ 一.HTTP a)Angular提供了自己的HTTP库来调用外部API,为了能够在等待API响应的过程中继续与界面交互,采用异步HTTP请求的方式. b)Get请求,首先导入Http, Respo ...

  7. Angular基础(六) DI

      一.依赖注入 a) 如果模块A需要依赖模块B,通常的做法是在A中导入B,import{B} from ‘B’,但有一些场合需要解除这种直接依赖,比如单元测试时需要mock一个B对象.还有时要创建B ...

  8. MVC与单元测试实践之健身网站(六)-计划的添加与重置

    健身计划需要使用者自己定制,没有现成的内容可供选择.本篇就是关于健身计划的添加与重置功能的一部分. 一 功能描述 a) 关于计划的定制,决定以周期的方式,比如有人会以一周为周期,然后安排每周的1.3. ...

  9. Flutter 布局(八)- Stack、IndexedStack、GridView详解

    本文主要介绍Flutter布局中的Stack.IndexedStack.GridView控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Stack A widget that po ...

  10. Python之逻辑回归

    代码: import numpy as np from sklearn import datasets from sklearn.linear_model import LogisticRegress ...