MySQL,空字符串和空格字符串比较

MySQL,空字符串和空格字符串比较,第1张

问题:

返回结果错误;

明明没有' '的行,居然匹配一堆数据;

对比发现返回的都是''匹配的行

验证:

有趣的是,

google答案:

这个失败的原因在这里的文档 http://dev.mysql.com/doc/refman/5.0/en/char.html 中解释:

CHAR和VARCHAR列中的值按照排序和比较 到分配给列的字符集整理。

所有MySQL串联都是类型的PADSPACE.这意味着所有CHAR, 将MySQL中的varchar和TEXT值进行比较,而不考虑任何内容 在这种情况下,“比较”不包括 像pattern-matching运算符,尾随空间是 重要。

解决这个问题的一种方法是将其转换为BINARY

您还可以使用LIKE:

我的答案是纯手打的,请认真看,不要浪费我的表情哦~

如果以字符串存储,格式就是 年月日(20120101等于2012-01-01)的话

首先把 日期字符串 转换成 合格的日期

concat_ws(连接符号,字符串1,字符串2...)

第一步代码:

SELECT

CONCAT_WS('-',

SUBSTRING('20120101',1,4),

SUBSTRING('20120101',5,2),

SUBSTRING('20120101',7,2) ) AS 开始日期 ,

CONCAT_WS('-',

SUBSTRING('20120608',1,4),

SUBSTRING('20120608',5,2),

SUBSTRING('20120608',7,2) ) AS 结束日期

------------------------------------------------------------

第二步,将日期使用日期运算函数进行相减:

TIMESTAMPDIFF(返回结果,日期1,日期2)

最终代码:

SELECT

CONCAT_WS('-',

SUBSTRING('20120101',1,4),

SUBSTRING('20120101',5,2),

SUBSTRING('20120101',7,2) ) AS 开始日期 ,

CONCAT_WS('-',

SUBSTRING('20120608',1,4),

SUBSTRING('20120608',5,2),

SUBSTRING('20120608',7,2) ) AS 结束日期 ,

TIMESTAMPDIFF(

DAY,

CONCAT_WS('-',

SUBSTRING('20120101',1,4),

SUBSTRING('20120101',5,2),

SUBSTRING('20120101',7,2) ) ,

CONCAT_WS('-',

SUBSTRING('20120608',1,4),

SUBSTRING('20120608',5,2),

SUBSTRING('20120608',7,2) )

) AS 相差天数

-------------------------------------------------------------------------------------

不好意思,看错题目,我以为你是要运算。如果是比较,就先把日期转换为时间戳进行比较是这样:

unix_timestamp(日期)

SELECT

unix_timestamp(

CONCAT_WS('-',

SUBSTRING('20120101',1,4),

SUBSTRING('20120101',5,2),

SUBSTRING('20120101',7,2) )

) AS 开始日期,

unix_timestamp(

CONCAT_WS('-',

SUBSTRING('20120608',1,4),

SUBSTRING('20120608',5,2),

SUBSTRING('20120608',7,2) )

) AS 开始结束

--------------------------------------------------------------------------

直接判断即可

新建一个数据库来验证:

CREATE DATABASE test5_4_17

DEFAULT CHARACTER SET utf8

DEFAULT COLLATE UTF8_BIN

#新建一个test_4_17 使用utf8字符串

USE test5_4_17

#打开数据库

CREATE TABLE test(

id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,

date_v VARCHAR(30) NOT NULL

)

INSERT INTO test VALUES(NULL,'20110303')

INSERT INTO test VALUES(NULL,'20120303')

INSERT INTO test VALUES(NULL,'20120304')

INSERT INTO test VALUES(NULL,'20130303')

SELECT * FROM test#查看数据有了

SELECT * FROM

test

WHERE

UNIX_TIMESTAMP(date_v) >=

unix_timestamp(

CONCAT_WS('-',

SUBSTRING('20120101',1,4),

SUBSTRING('20120101',5,2),

SUBSTRING('20120101',7,2) )

)

AND

UNIX_TIMESTAMP(date_v) <=

unix_timestamp(

CONCAT_WS('-',

SUBSTRING('20120608',1,4),

SUBSTRING('20120608',5,2),

SUBSTRING('20120608',7,2) )

)

结果是

20120303

20120304

-----------------------------------------------------------------------------------------

参数中的 日期字符串 可以换成 字段名

SQL中比较两个字符串的大小的规则和C/C++、Java、Python等众多主流语言的规则相同,或者说是编程语言通用的规则:逐一比较对应位字符的ANSI码/Unicode码。若相同继续比较下一个字符,直到第一次出现不同,或其中一个字符串到达结尾。该位编码值较小的或已到达结尾的字符串被认为小于另一个字符串。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6112960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-15
下一篇 2023-03-15

发表评论

登录后才能评论

评论列表(0条)

保存