COALESCE Extrage结果日期和字符串

时间:2013-12-18 15:54:01

标签: mysql mysql-workbench

首先,我想澄清一下,我已经阅读了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服务器从他们的客户端收到了原始查询(文本),现在我意识到这根本不是真的。在客户端执行什么级别的预处理?

1 个答案:

答案 0 :(得分:1)

最后,似乎我认为在客户端没有进行硬预处理是正确的。

差异来自数据可视化:rules for implicit type conversion适用于COALESCE,因此,当其输入列表的某些元素是日期而其他元素是字符串时,这些规则会将所有元素隐式转换为包含每个日期字符串的BLOB表示。

  

如果其中一个参数是TIMESTAMP或DATETIME列而另一个参数是常量,则在执行比较之前将常量转换为时间戳。这样做是为了更友好的ODBC。请注意,这不是针对IN()的参数!为安全起见,在进行比较时始终使用完整的日期时间,日期或时间字符串。例如,要在将BETWEEN与日期或时间值一起使用时获得最佳结果,请使用CAST()将值显式转换为所需的数据类型。

另一方面,mysql控制台客户端自动将此blob显示为文本,而MySQL workbench则使用其BLOB表示。

enter image description here

如果打开:

enter image description here

哪个可以作为文本读取(默认情况下是mysql控制台客户端执行的操作): enter image description here

在我看来,基于我上面引用的MySQL参考文本,处理这个问题的最好方法是将日期元素转换为日期。这样,就不会进行隐式转换,COALESCE会返回日期类型值。