Mysql 如何在不改变表结构的情况下,区分a,A和ā

Mysql 如何在不改变表结构的情况下,区分a,A和ā

数据库建表时通常就已经指定了排序和字符集。例如:

CREATE TABLE `table` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1',
`field2` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '字段2',
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci;

其中 field2 varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT ‘’ COMMENT ‘字段2’,指定了排序的规则utf8_unicode_ci与排序的字段“字段2”。这将会影响DISTINCT、GROUP BY、HAVING语句的查询结果。
很多COLLATE都带有_ci字样,这是Case Insensitive的缩写,即大小写无关,也就是说”A”和”a”在排序和比较的时候是一视同仁的。selection * from table1 where field1=”a”同样可以把field1为”A”的值选出来。与此同时,对于那些_cs后缀的COLLATE,则是Case Sensitive,即区分大小写的。
需要注意的是,在mysql中虽然有utf8和utf8mb4两种编码,但是请使用utf8mb4。这是mysql的一个遗留问题,mysql中的utf8最多只能支持3bytes长度的字符编码,对于一些需要占据4bytes的文字,mysql的utf8就不支持了,要使用utf8mb4才行。(题外话)

因此,在做查询的时候就会发现,a 与 A 与 āáǎà是一样的:

SELECT ‘ǎ’ = ‘a’ as equal;
结果:

equal
1

那么如何在不影响表结构的情况下进行对āáǎà的查询呢?请看下面的sql语句:

SELECT CONVERT('ǎ' USING BINARY)= CONVERT('a' USING BINARY) as equal;

查询的结果:

equal
0

在将āáǎà 与a转换为二进制后,两者可以在Mysql中进行区分了。

发布了2 篇原创文章 · 获赞 1 · 访问量 35

猜你喜欢

转载自blog.csdn.net/qq_42178741/article/details/103933662