mysql条件匹配插入_Mysql数据库中sql语句中where条件中文本匹配问题

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'

会导致重复键错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值