ITPub博客

首页 > 数据库 > MySQL > Mysql数据库中sql语句中where条件中文本匹配问题

Mysql数据库中sql语句中where条件中文本匹配问题

原创 MySQL 作者:小小蜗牛a 时间:2018-07-28 17:15:02 0 删除 编辑

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' 会导致重复键错误。

 

https://dev.mysql.com/doc/refman/5.6/en/char.html



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31535470/viewspace-2168564/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2018-05-04

  • 博文量
    3
  • 访问量
    6593