Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用select查询筛选带有非重音字符的列_Mysql_Search_Non Ascii Characters - Fatal编程技术网

Mysql 如何使用select查询筛选带有非重音字符的列

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

我有一个使用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, 'áááá');
如果我运行下面的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