当我使用视图,case语句和null检查的组合时,我从MySQL查询中得到一个奇怪的警告。我相信我有一个最小的测试用例:
create table t (x char(1)) default charset 'utf8';
insert into t values ('a');
create or replace view v as select case when true then x end as y from t;
select y is null from v;
show warnings;
我看到:
+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'a ' |
+---------+------+------------------------------------------+
当我内联视图、删除case语句或删除null检查时,警告就会消失。
另一个令人困惑的事情是,在警告消息中,字符串被右填充到其原始长度的3倍,无论我们在create table
和insert
语句中设置的长度是多少。如果我从create table
语句中删除default charset 'utf8'
,右填充将消失,但警告仍然存在。
注意,在我的用例中,这个警告实际上变成了一个错误,我做了以下等价的操作:
create table t2 (x char(1)) default charset 'utf8';
insert into t2 select y is null from v;
我找不到关于这个问题的bug报告,我认为这不是预期的行为。我正在使用服务器版本:5.6.11-56-log Percona服务器(GPL),发布rc60.3,修订376。有人能解释一下为什么会发生这种情况和/或建议一个解决方案吗?
我找到了一个解决方法,并将在这里发布,以防其他人有同样的问题。而不是:
select y is null from v
使用:
select y is null from (select y from v) as _