版权声明:声明:本文档能够转载,须署名原作者。 作者:无为 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. ContextLoaderListener可以不写嘛?

    写了那么久的Spring,经常写这样的配置,这就是几行Spring.SpringMvc的基本配置, 但是最近也看到不写最前面的context-param以及listener的,好奇记录下. <c ...

  2. 【CSS学习】--- z-index属性

    一.前言 网页显示实际上是三维的,我们直观看到的有x轴和y轴,但在网页布局上还有一个z轴. 对于定位元素,我们使用top.right.left.bottom来实现元素在x-y平面上的定位,但为了表示布 ...

  3. 突发奇想想学习做一个HTML5小游戏

    前言: 最近一期文化馆轮到我分享了,分享了两个,一个是关于童年教科书的回忆,一个是关于免费电子书的.最后我觉得应该会不敌web,只能说是自己在这中间回忆了一下那个只是会学习的年代,那个充满梦想的年代. ...

  4. hexo自动部署到git、ftp(虚拟主机等)、云服务器的方式

    自动部署很有用,当你写完文章后,直接使用hexo d就可以自动更新你的网站了 部署到git 首先你需要在你的blog下安装git deployer插件:npm install hexo-deploye ...

  5. Eclipse SVN 冲突的 介绍 及 四种解决方式

    https://blog.csdn.net/diyu122222/article/details/79879376

  6. CSS设置百分比值的问题

    当给元素设置width:100%:height:100% 的时候没有反应 因为,元素的宽高是根据内容来自动适应的,当设置百分比值时,是根据这个元素的父元素来确定百分比的 如果父元素没有固定的值,那就需 ...

  7. git常用命令以及如何与fork别人的仓库保持同步

    简单常用命令1.git status查看当前仓库是否有文件改动a:提示Your branch is up-to-date with 'origin/master'.nothing to commit, ...

  8. blfs(systemd版本)学习笔记-wget的安装与配置

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! blfs wget项目地址:http://www.linuxfromscratch.org/blfs/view/stable-s ...

  9. VUE组件 之 Toast (Vue.extend 方式)

    一.效果图 二.说明 这类提示框组件我们通常都会直接在 JS 代码中进行调用.像下面这样: this.$toast('别点啦,到头啦!') 但看到网上大多数还是通过 component  方式实现的, ...

  10. 解决如下问题:You are using pip version 8.1.1, however version 18.0 is available. You should consider upgrading via the 'pip install --upgrade pip' command.

    问题描述: 今天想学习一下TUM数据集RGBD-Benchmark工具的使用,利用python进行相关操作时,缺少一个第三方模块,于是打算用pip进行安装,便出现如下图所示的问题. 解决办法: 执行如 ...