如何解决Mysql数据库中sql语句的where条件中文本匹配问题

66次阅读
没有评论

共计 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 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计1541字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)