M
ysql数据库中
sql语句中where条件中文本匹配问
题
问题描述
字段
name
类型为
varchar
时
(CHAR
,
VARCHAR
和
TEXT
情况都一样
)
,
语句一
select * from aaa where name='a';
语句二
select * from aaa where name='a ' ;
结果一样:不能区分末尾是否有空格,
建议:
1
、如果必须精确匹配(包括大小写和末尾空格)建议转换成二进制比较,使用
select * from aaa where name=BINARY'a ' ;
2
、如果需要精确校验末尾是否有空格,但是保留大小写模糊匹配
(
默认校对规则
_ci
大小写不敏感
)
,建议增加
length(name)
就可以比较出长度来区分
3
、如果需要精确校验大小写,但是保留末尾空格忽略,可以使用
select * from aaa where name='a' collate utf8_cs;
(字符为
utf8
)
4
、默认设置情况下,
a
、
where name='a';
b
、
where name='a ';
(末尾有空格)
c
、
where name='A';
b
、
where name='A ';(
末尾有空格
)
四中情况匹配的结果是一样的,
经查询官方文档:
所有
MySQL
归类都是
PAD SPACE
类型。 这意味着所有
CHAR
,
VARCHAR
和
TEXT
值都会进行比较,而不考虑任何尾随空格。 在此上下文中的“比较”不包括
LIKE
模式匹配运算符,其尾部空格是重要的。 例如:
mysql>
CREATE TABLE names (myname CHAR(10));
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO names VALUES ('Monty');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT myname = 'Monty', myname = 'Monty ' FROM names; +------------------+--------------------+
| myname = 'Monty' | myname = 'Monty ' |
+------------------+--------------------+
| 1 | 1 |
+------------------+--------------------+
1 row in set (0.00 sec)
mysql> SELECT myname LIKE 'Monty', myname LIKE 'Monty ' FROM names; +---------------------+-----------------------+ |
myname LIKE 'Monty' | myname LIKE 'Monty ' |
+---------------------+-----------------------+
| 1 | 0 |
+---------------------+-----------------------+
1 row in set (0.00 sec)
对于所有
MySQL
版本都是如此,并且不受服务器
SQL
模式的影响。
注意
有关
MySQL
字符集和归类的更多信息,请参阅第
10
章,字符集,归类,
Unicode
。 有关存储要求的更多信息,请参见第
11.7
节“数据类型存储要求”。
对于尾随填充字符被去除或比较忽略它们的情况,如果列的索引需要唯一值,则插入到仅与尾部填充字符数不同的列值中将导致重复键错误。
例如,如果一个表包含
'a'
,则尝试存储
'a'
会导致重复键错误。