Mysql 对比较日期字段和文字感到困惑吗

Mysql 对比较日期字段和文字感到困惑吗,mysql,sql,Mysql,Sql,我对下面的行为感到困惑。为什么第一个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

我对下面的行为感到困惑。为什么第一个
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) mysql>创建数据库测试; 查询正常,1行受影响(0.00秒) mysql>使用测试; mysql>设置名称utf8校对utf8\U常规\U ci; 查询正常,0行受影响(0.00秒) mysql>创建表foo( 酒吧日期不为空 )ENGINE=InnoDB默认字符集=utf8 COLLATE=utf8\U unicode\U ci; 查询正常,0行受影响(0.15秒) mysql>插入foo(bar)值('2013-01-01'); 查询正常,1行受影响(0.00秒) mysql>从foo中选择COUNT(*),其中bar>='2013-01-01 00:00:00'; +----------+ |计数(*)| +----------+ | 1 | +----------+ 一行一组(0.00秒) mysql>设置名称utf8校对utf8\U unicode\U ci; 查询正常,0行受影响(0.00秒) mysql>从foo中选择COUNT(*),其中bar>='2013-01-01 00:00:00'; +----------+ |计数(*)| +----------+ | 0 | +----------+ 一行一组(0.00秒) 你试过了吗

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

解释

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

尝试:

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

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

SET NAMES utf8 COLLATE utf8_general_ci;

SELECT * FROM foo;

SET NAMES utf8 COLLATE utf8_unicode_ci;

SELECT * FROM foo;