2013-11-27 wcdj
问题
最近在联调某个业务时发现使用的签名总是验证不过,在MySQL中查询了该业务的私钥配置和业务侧的配置是一样的,问题就出在SQL查询这里,最后将配置导出到本地发现私钥后面多了一个空格,将空格删除然后签名计算OK。问题是:为什么在DB查询条件中的字符串没有包含空格也可以查到实际包含空格的这条记录呢?
原因
如果字段是char或varchar类型,那么在字符串比较的时候MySQL使用PADSPACE校对规则,会忽略字段末尾的空格字符,若想做到精确匹配可以使用下面几种方法:
方法1:使用like语句;
方法2:使用binary类型,例如,select binary 'a' = 'a '
方法3:再添加一个length()条件,例如,select col from table where col =
'a ' and LENGTH(col)
=
LENGTH('a ')
官方手册说明(5.0版本):
11.1.6.1. The CHAR and VARCHAR Types
All MySQL collations are of type
PADSPACE. This means that all
CHAR,
VARCHAR, and
TEXT
values in MySQL are compared without regard to any trailing spaces.
“Comparison”
in this context does not include the
LIKE
pattern-matching operator, for which trailing spaces are significant.
在stackoverfolw上也可以找到类似的问题:
MySQL comparison operator, spaces
本文探讨了在MySQL查询中遇到字符串包含空格的问题及其原因。通过详细分析,揭示了11.1.6.1小节关于'The'和'Types'的相关内容。
4953

被折叠的 条评论
为什么被折叠?



