如何使用 select 查询过滤包含非重音字符的列

How to filter a column with Non-accented characters using select query

我有一个 MySQL table(测试),采用 utf-8 字符集编码。共有三个条目,两个带有普通字符的条目和另一个带有重音字符的名称。

CREATE TABLE test (
  id Integer,
  name VARCHAR(50), 
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `test` (`id`, `name`) VALUES (1, 'aaaa');
INSERT INTO `test` (`id`, `name`) VALUES (2, 'AAAA');
INSERT INTO `test` (`id`, `name`) VALUES (3, 'áááá');

如果我 运行 以下 select 查询,它 return 包含所有 3 个条目

实际结果:-

select * from test where name like '%aa%';

id  | name
----|----
1   | aaaa
2   | AAAA
3   | áááá

取而代之的是,它应该是 return id=3 的最后一个条目。

我不想使用 'BINARY' 或 'COLLATE utf8_bin',因为它 return 只是区分大小写的搜索。

我需要使用字符串 like 查询进行正常搜索,例如:-

预期结果:-

select * from test where name like '%aa%';

id | name
---|-----
1  | aaaa
2  | AAAA

utf8_bin是你要区分重音字符的排序规则。

在查询中您可以使用 lower 使查询不区分大小写。

CREATE TABLE `token` (
  `id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

mysql> select * from token where lower(name) like '%aa%';
+----+------+
| id | name |
+----+------+
|  1 | aaaa |
|  2 | AAAA |
+----+------+
2 rows in set (0.00 sec)

您可以使用以下查询解决您的问题

  select * from token where (convert(name using ASCII)) like '%aa%'

convert用于字符集之间的转换

utf8_bin 排序规则是处理重音符号所需要的

I don't want to use 'BINARY' OR 'COLLATE utf8_bin' because it returns only case sensitive search.

用 utf8_bin 解决重音问题比用另一个排序规则

更容易(也更高效)
SELECT * FROM test WHERE LOWER(name) like '%aa%' COLLATE utf8_bin

-> 添加在评论后

上面的查询假定查询参数很小,但如果您不能将参数修改为始终很小,那么您也可以使用这种变体

SELECT * FROM test WHERE LOWER(name) like LOWER('%ÚÙ%') COLLATE utf8_bin

使用 RLIKE (REGEXP) 可以解决您的问题(它将 return 通过使用更强大的 like 版本来达到您的预期结果)

来自 MYSQL-文档:
正则表达式是为复杂搜索指定模式的一种强大方式。
... REGEXP 不区分大小写,除非与二进制字符串一起使用。

只需替换

where name like '%aa%'

where Name rlike 'aa';

对表达式 'aa'.

进行不区分大小写的搜索

但是 :
这可能是一种不安全的方法,因为根据 MySQL 文档比较多字节字符可能会产生意想不到的结果。

您可以尝试:

SELECT * FROM test.test
where convert(name using ascii) like '%aa%';

但要小心,convert 对索引有性能问题。更多信息请访问 http://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html