Mysql 如何使用select查询筛选带有非重音字符的列
我有一个使用utf-8字符集编码的MySQL表(测试)。共有三个条目,两个条目带有普通字符,另一个条目带有重音字符Mysql 如何使用select查询筛选带有非重音字符的列,mysql,search,non-ascii-characters,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 I
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查询,它将返回所有3个条目
实际结果:-
select * from test where name like '%aa%';
id | name
----|----
1 | aaaa
2 | AAAA
3 | áááá
select * from test where name like '%aa%';
id | name
---|-----
1 | aaaa
2 | AAAA
相反,它应该返回id为3的最后一个条目
我不想使用“BINARY”或“COLLATE utf8\u bin”,因为它只返回区分大小写的搜索
我需要使用字符串进行常规搜索,如查询,例如:-
预期结果:-
select * from test where name like '%aa%';
id | name
----|----
1 | aaaa
2 | AAAA
3 | áááá
select * from test where name like '%aa%';
id | name
---|-----
1 | aaaa
2 | AAAA
utf8\u bin
是要区分重音字符的排序规则
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, 'áááá');
在查询中,您可以使用用户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\u-bin排序规则是处理重音符号所需的
我不想使用“BINARY”或“COLLATE utf8\u bin”,因为它只返回区分大小写的搜索
与使用另一个排序规则解决重音问题相比,使用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)可以解决您的问题(使用功能更强大的like版本将返回您期望的结果)
来自MYSQL文档:正则表达式是为复杂搜索指定模式的强大方法。
.... REGEXP不区分大小写,除非与二进制字符串一起使用 替换
where name like '%aa%'
与
对表达式“aa”执行不区分大小写的搜索
但是:这可能是一种不安全的方法,因为根据MySQL文档,通过比较多字节字符可能会产生意外的结果 您可以尝试:
SELECT * FROM test.test
where convert(name using ascii) like '%aa%';
但是要小心,convert在索引上有性能问题。更多信息请访问简单地说。您可以在搜索(编写函数)之前删除列中的重音符号,例如,
where removeaccent(name),如“%aa%”
get“错误1305(42000):函数DB.removeaccent不存在”我在哪里编写函数?这里的任何输入都非常有用您应该编写自己的函数,例如CREATE function CustomerLevel(name VARCHAR(100))返回VARCHAR(100)
@SST-问题已解决,请检查我的答案它应该只返回前两个条目..mysql>从名为“%aa%”的令牌中选择*;(1,aaaa),(2,aaaa)抱歉,误解了您的问题。更新了答案。在此查询中,如果我有一个名为“ÛÚÙý”的混合字符名称和'uuuë253;',上面的查询返回空集[mysql>select*from test where name=convert(名称使用ASCII)和类似'%uu%';空集(0.00秒)]。它应该返回名为“uuë253;”@SST-answer modified的行。现在检查谢谢@Fathan!!当我执行此查询时[select*from test where(convert(名称使用ASCII))与“%u217%”类似,它会抛出一个错误。错误1267(HY000):非法混合排序规则(ascii_general_ci,隐式)和操作“like”的(utf8_general_ci,可强制)它应该返回两个查询的任何一个条目[1.从测试中选择*(使用ascii转换名称))像“%uu%”;回答:| 5 | uuuý2.从测试中选择*(转换(名称使用ASCII))如“%4”;“4”;“5”;“uu”;“4”;“uu”;“4”;“uu”;“5”;“为什么会失败?”)很抱歉,我没有指定,因为您希望不区分大小写,我们使用小写来降低名称的大小写,但搜索词也需要使用小写。是否有可能搜索不区分大小写的字符串?从测试中选择*,其中小写(名称)如小写(“%ÚÙ%”)比较utf8\u-bin