首先,我想澄清一下,我已经阅读了this个问题。这里描述的问题与我的问题非常相似,但与已经解决的bug有关。
通过在Windows上运行的MySQL WorkBench 5.2.47 C查询MySQL服务器(在Linux上运行的Ver 14.14)后,我得到了奇怪的结果。
问题是COALESCE在日期和字符串字段列表上的选择会返回BLOBS而不是日期。例如
SET @dat='20130812';
SELECT COALESCE(dateA, @dat) FROM table1;
我知道可以通过将COALESCE转换为DATE类型来解决问题:
SELECT CAST(COALESCE(dateA,$dat) AS DATE) FROM table1;
它也可以解决只是铸造@dat:
SELECT COALESCE(dateA,CAST(@dat AS DATE)) FROM table1;
在我看来它与内部类型转换有关,但是,当客户端是mysql控制台客户端时,为什么我的第一个查询工作? (正如上面链接的问题所述)。
客户端是否执行某种类型的查询预处理?在这种情况下,所有客户都不应该这样做吗?
我曾经认为SQL服务器从他们的客户端收到了原始查询(文本),现在我意识到这根本不是真的。在客户端执行什么级别的预处理?
答案 0 :(得分:1)
最后,似乎我认为在客户端没有进行硬预处理是正确的。
差异来自数据可视化:rules for implicit type conversion适用于COALESCE,因此,当其输入列表的某些元素是日期而其他元素是字符串时,这些规则会将所有元素隐式转换为包含每个日期字符串的BLOB表示。
如果其中一个参数是TIMESTAMP或DATETIME列而另一个参数是常量,则在执行比较之前将常量转换为时间戳。这样做是为了更友好的ODBC。请注意,这不是针对IN()的参数!为安全起见,在进行比较时始终使用完整的日期时间,日期或时间字符串。例如,要在将BETWEEN与日期或时间值一起使用时获得最佳结果,请使用CAST()将值显式转换为所需的数据类型。
另一方面,mysql控制台客户端自动将此blob显示为文本,而MySQL workbench则使用其BLOB表示。
如果打开:
哪个可以作为文本读取(默认情况下是mysql控制台客户端执行的操作):
在我看来,基于我上面引用的MySQL参考文本,处理这个问题的最好方法是将日期元素转换为日期。这样,就不会进行隐式转换,COALESCE会返回日期类型值。