4

我对下面的行为感到困惑。为什么第一条SELECT语句返回 1 而第二条语句返回 0?我希望它们都返回 1 因为日期大于或等于文字。

为什么排序规则会影响日期比较?在将日期与文字进行比较时,将日期(或日期时间)表示为字符串是否错误?如果是这样,我应该如何进行日期与文字比较?

mysql> 创建数据库测试;
查询正常,1 行受影响(0.00 秒)

mysql> 使用测试;

mysql> 设置名称 utf8 整理 utf8_general_ci;
查询正常,0 行受影响(0.00 秒)

mysql> 创建表 foo (
  酒吧日期不为空
) 引擎=InnoDB 默认字符集=utf8 排序=utf8_unicode_ci;
查询正常,0 行受影响(0.15 秒)

mysql> INSERT INTO foo (bar) VALUES ('2013-01-01');
查询正常,1 行受影响(0.00 秒)

mysql> SELECT COUNT(*) FROM WHERE bar >= '2013-01-01 00:00:00';
+----------+
| 计数(*) |
+----------+
| 1 |
+----------+
一组中的 1 行(0.00 秒)

mysql> 设置名称 utf8 整理 utf8_unicode_ci;
查询正常,0 行受影响(0.00 秒)

mysql> SELECT COUNT(*) FROM WHERE bar >= '2013-01-01 00:00:00';
+----------+
| 计数(*) |
+----------+
| 0 |
+----------+
一组中的 1 行(0.00 秒)

4

2 回答 2

0

您可能假设数据库正在将您的文字字符串进行隐式类型转换为日期并比较日期。看起来数据库正在将日期隐式类型转换为字符串并比较字符串。排序规则会影响此转换,从而影响您的结果。

尝试:

SET NAMES utf8 COLLATE utf8_general_ci;

SELECT * FROM foo;

SET NAMES utf8 COLLATE utf8_unicode_ci;

SELECT * FROM foo;

这两个查询应该给出解释行为的不同结果。

在任何情况下,cha 的建议都会起作用,因为您告诉 db 将文字字符串显式转换为日期,然后比较日期。

于 2013-02-26T04:25:40.007 回答
0

你有没有尝试过

SELECT COUNT(*) FROM foo WHERE bar >= _utf8'2013-01-01 00:00:00'

解释在这里

于 2013-02-26T03:52:17.087 回答