加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中enum插入的关注事项有哪些

发布时间:2022-01-14 10:39:23 所属栏目:MySql教程 来源:互联网
导读:MySQL中enum插入的注意事项有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 今天在执行开发发过来的工单的时候,source批量导入执行时候发现报了很多警告 提示 truncate for colu
        MySQL中enum插入的注意事项有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
 
       今天在执行开发发过来的工单的时候,source批量导入执行时候发现报了很多警告 提示 truncate for column xxxxx 。导入完成后,使用select查询后,发现大量数据未成功插入。
 
       后来发现是enum字段没有加引号搞的鬼。
 MySQL中enum插入的关注事项有哪些
结论:
 
      enum的字段,在插入的时候,必须带上引号。否则会出现不可预期的问题。
 
验证过程如下:
 
[none] > use test;
 
[test] > create table t1(
 
a int primary key auto_increment,
 
b enum('4','3','2','1') default '3');
 
[test] > INSERT INTO t1 (b) VALUES (4);
 
Query OK, 1 row affected
 
Time: 0.012s
 
[test] > INSERT INTO t1 (b) VALUES ('4');
 
Query OK, 1 row affected
 
Time: 0.012s
 
[test] > SELECT * from t1;
 
+-----+-----+
 
|   a |   b |
 
|-----+-----|
 
|   1 |   1 |    --->  这里我们执行的是 INSERT INTO t1 (b) VALUES (4);    结果却插入的是数值1,和我们实际上的目标结果完全不一致。
 
|   2 |   4 |    --->  这里我们执行的是 INSERT INTO t1 (b) VALUES ('4');  这里插入带引号的4,和我们的预期结果一致。
 
+-----+-----+
 
原因:
 
  enum类型的字段插入数值的时候, 带引号的时候,插入的才是真正的数值。 如果不带引号插入的话,实际上是插入的key(如上面的例子中 INSERT INTO t1 (b) VALUES (4),插入的是b列第四个default值,也就是取enum('4','3','2','1')第四个默认值,即最终插入的是数值1)。
 
试验,宽松sql_mode下的插入情况:
 
[test] > set session sql_mode='';
 
[test] > INSERT INTO t1 (b) VALUES (5);   ---> 插入一个超出enum下标范围的值
 
Query OK, 1 row affected
 
Time: 0.012s
 
[test] > INSERT INTO t1 (b) VALUES ('5');   ---> 插入一个不在enum允许的值
 
Query OK, 1 row affected
 
Time: 0.011s
 
[test] > SELECT * from t1;
 
+-----+-----+
 
|   a | b   |
 
|-----+-----|
 
|   1 | 1   |
 
|   2 | 4   |
 
|   3 |     |
 
|   4 |     |
 
+-----+-----+
 
[test] > SELECT * from t1 where b = '';
 
+-----+-----+
 
|   a | b   |
 
|-----+-----|
 
|   3 |     |
 
|   4 |     |
 
+-----+-----+
 
[test] > SELECT * from t1 where b is null;
 
+-----+-----+
 
| a   | b   |
 
|-----+-----|
 
+-----+-----+
 
可以看到在sql_mode为空的时候,虽然插入的时候没有报错,但是实际上查询是没有结果的,(查出来后插入的2行的b是''空值,不是NULL)。
 
继续试验,严格的sql_mode下异常插入的情况:
 
[test] > set session sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
 
[test] > INSERT INTO t1 (b) VALUES ('5');
 
(1265, u"Data truncated for column 'b' at row 1")
 
[test] > INSERT INTO t1 (b) VALUES (5);
 
(1265, u"Data truncated for column 'b' at row 1")
 
可以看到严格的sql_mode下,我们的异常插入就直接报错了。

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!