我有一个使用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
答案 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