如何使用 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
我有一个 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