我对以下行为感到困惑。为什么第一个SELECT
语句返回1而第二个语句返回0?我希望它们都返回1,因为日期大于或等于文字。
为什么排序规则会影响日期比较?将日期与文字进行比较时,将日期(或日期时间)表示为字符串是错误的吗?如果是这样,我应该怎么做日期与文字比较?
mysql> CREATE DATABASE test; Query OK, 1 row affected (0.00 sec) mysql> USE test; mysql> SET NAMES utf8 COLLATE utf8_general_ci; Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE foo ( bar date NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; Query OK, 0 rows affected (0.15 sec) mysql> INSERT INTO foo (bar) VALUES ('2013-01-01'); Query OK, 1 row affected (0.00 sec) mysql> SELECT COUNT(*) FROM foo WHERE bar >= '2013-01-01 00:00:00'; +----------+ | COUNT(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec) mysql> SET NAMES utf8 COLLATE utf8_unicode_ci; Query OK, 0 rows affected (0.00 sec) mysql> SELECT COUNT(*) FROM foo WHERE bar >= '2013-01-01 00:00:00'; +----------+ | COUNT(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec)
答案 0 :(得分:0)
答案 1 :(得分:0)
您可能认为数据库正在将文字字符串的IMPLICIT类型转换为日期并比较日期。看起来db正在将日期的IMPLICIT类型转换为字符串并比较字符串。排序规则会影响此转化,从而影响您的结果。
尝试:
SET NAMES utf8 COLLATE utf8_general_ci;
SELECT * FROM foo;
SET NAMES utf8 COLLATE utf8_unicode_ci;
SELECT * FROM foo;
这两个查询应该给出解释行为的不同结果。
在任何情况下,cha的建议都会有效,因为你告诉数据库明确地将文字字符串转换为日期,然后比较日期。