在写SQL语句做测试时报了题目这样的错误,说是Truncated incorrect INTEGER value: '2001d2s4';即截断不正确的INTEGER值:'2001d2s4';
语句的目的是把select出来的结果insert到一个表中。
出此问题的语句是以下三句:
1.
INSERT INTO nyftest.sc ( sno, cno ) SELECT
sno,
cno
FROM
nyftest.sct
WHERE
tno IN ( SELECT tno FROM nyftest.teacher WHERE tname IS NOT NULL );
译为:
INSERT INTO nyftest.sc ( sno, cno ) SELECT
( CASE WHEN sno = '' THEN NULL ELSE sno END ) sno,
( CASE WHEN cno = '' THEN NULL ELSE cno END ) cno
FROM
nyftest.sct
WHERE
( CASE WHEN tno = '' THEN NULL ELSE tno END ) IN (
SELECT
( CASE WHEN tno = '' THEN NULL ELSE tno END ) tno
FROM
nyftest.teacher
WHERE
( CASE WHEN tname = '' THEN NULL ELSE tname END ) IS NOT NULL
);
2.
INSERT INTO nyftest.sc ( sno, cno ) SELECT
sno,
cno
FROM
nyftest.sct
WHERE
tno IN ( SELECT tno FROM nyftest.teacher );
译为:
INSERT INTO nyftest.sc ( sno, cno ) SELECT
( CASE WHEN sno = '' THEN NULL ELSE sno END ) sno,
( CASE WHEN cno = '' THEN NULL ELSE cno END ) cno
FROM
nyftest.sct
WHERE
( CASE WHEN tno = '' THEN NULL ELSE tno END ) IN ( SELECT ( CASE WHEN tno = '' THEN NULL ELSE tno END ) tno FROM nyftest.teacher );
3.
INSERT INTO nyftest.sc ( sno, cno ) SELECT
sno,
cno
FROM
nyftest.sct
WHERE
sno IS NOT NULL;
译为:
INSERT INTO nyftest.sc ( sno, cno ) SELECT
( CASE WHEN sno = '' THEN NULL ELSE sno END ) sno,
( CASE WHEN cno = '' THEN NULL ELSE cno END ) cno
FROM
nyftest.sct
WHERE
( CASE WHEN sno = '' THEN NULL ELSE sno END ) IS NOT NULL;
其中select语句的执行并没有问题,但是在想要把select的结果插入到另外一个表中的时候,就会出现截断INTEGER的这种错误,尽管的我SQL语句中并没有INTEGER类型的值,出错的语句一般都是select语句中的where部分后面跟了is not null。
查了很多帖发现应该是mysql的bug,详情参见此链接https://bugs.mysql.com/bug.php?id=76353
该链接中说,可以为数据库更改一个名为“sql_mode”的变量值,当为其赋值为空时,insert操作不会再报错误而是报警告,暂时不知道更改了sql_mode之后会不会影响到其他的一般SQL操作。问过别人说这个改了之后就影响了提示级别,所以不建议改。