如何使用选择查询过滤带有非重音字符的列

时间:2016-05-02 10:22:48

标签: mysql search non-ascii-characters

我有一个使用utf-8字符集编码的MySQL表(测试)。有三个条目,两个条目具有普通字符,另一个条目具有重音字符。

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, 'áááá');

如果我运行以下选择查询,它将返回所有3个条目

实际结果: -

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

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

而不是那样,它应该返回id = 3的最后一个条目。

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

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

预期结果: -

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

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

5 个答案:

答案 0 :(得分:6)

utf8_bin排序规则是您处理重音的需求

  

我不想使用' BINARY'或者'收集utf8_bin'因为它只返回区分大小写的搜索。

使用utf8_bin比使用其他排序规则解决重音问题更容易(且性能更高)

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

- >评论后添加

上面的查询假设查询参数是微不足道的但是如果你不能修改params总是小的那么你也可以使用这个变化

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

答案 1 :(得分:4)

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)

答案 2 :(得分:1)

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

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

convert用于在字符集之间进行转换

答案 3 :(得分:1)

使用RLIKE(REGEXP)可以解决您的问题(它会通过使用更强大的版本返回您的预期结果)

来自MYSQL文档的


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

只需替换

where name like '%aa%'

where Name rlike 'aa';

对表达式' aa'进行不区分大小写的搜索。

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

答案 4 :(得分:1)

您可以尝试:

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

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