mysql - COALESCE 提取日期和字符串的结果

标签 mysql mysql-workbench

首先,我想澄清一下,我已经阅读过 this问题。那里描述的问题与我的问题非常相似,但与一个错误有关,该错误已经解决。

通过在 Windows 上运行的 MySQL WorkBench 5.2.47 C 查询 MySQL 服务器(在 Linux 上运行的版本 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 服务器从其客户端接收原始查询(文本),现在我意识到这根本不是真的。客户端执行什么级别的预处理?

最佳答案

最后,看来我的想法是正确的,客户端没有进行硬预处理。

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

If one of the arguments is a TIMESTAMP or DATETIME column and the other argument is a constant, the constant is converted to a timestamp before the comparison is performed. This is done to be more ODBC-friendly. Note that this is not done for the arguments to IN()! To be safe, always use complete datetime, date, or time strings when doing comparisons. For example, to achieve best results when using BETWEEN with date or time values, use CAST() to explicitly convert the values to the desired data type.

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

enter image description here

如果打开:

enter image description here

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

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

关于mysql - COALESCE 提取日期和字符串的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662641/

相关文章:

php - MySQL php查询打印到屏幕而不是创建强制下载csv文件

MySQL 数据库模式创建者和所有者关系?例如用户和媒体?

php - 无法在 function() 之外正确访问变量

mysql - 即使插入列, 'WHERE' 子句中的 SQL 未知列

MySQL 工作台。错误 1452 : Cannot add or update a child row: a foreign key constraint fails. 操作失败

mysql - 如何在 MySQL Workbench 中检索存储的图像

mysql - 如何设置 MySQL Workbench 自动断开与服务器的连接?

mysql 使用 phpmyadmin 调用存储过程中的函数

mysql - 如何在 Laravel 中绑定(bind)参数 sql 查询参数而不使用原始选择?

php - 使用可选参数/排名构建 SQL 查询