当我使用视图,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语句或删除空检查时,警告消失。
另一个令人困惑的事情是,在警告消息中,无论我们在create table
和insert
语句中设置该长度,字符串都被右边填充到其原始长度的3倍。如果我从default charset 'utf8'
语句中删除create table
,则右边填充消失,但警告仍然存在。
请注意,此警告实际上在我的用例中变为错误,其中我执行以下操作:
create table t2 (x char(1)) default charset 'utf8';
insert into t2 select y is null from v;
我无法找到有关此问题的错误报告,我认为这不是预期的行为。我正在使用服务器版本:5.6.11-56-log Percona Server(GPL),版本rc60.3,修订版376.任何人都可以解释它为什么会发生和/或建议解决方法吗?
答案 0 :(得分:0)
我找到了解决方法并将其发布在此处,以防其他人遇到同样的问题。而不是:
select y is null from v
使用此:
select y is null from (select y from v) as _
不知道为什么会有效,但确实有效。