共计 1541 个字符,预计需要花费 4 分钟才能阅读完成。
这篇文章主要介绍如何解决 Mysql 数据库中 sql 语句的 where 条件中文本匹配问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
Mysql 数据库中 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 会导致重复键错误。
以上是“如何解决 Mysql 数据库中 sql 语句的 where 条件中文本匹配问题”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!