Rohit Gupta Asked: 2015-07-26 22:56:11 +0800 CST2015-07-26 22:56:11 +0800 CST 2015-07-26 22:56:11 +0800 CST 如何进行不区分大小写的高效搜索 772 例如,以包含 2 列的城市表为例 city_ref (bigint) 城市名称(可变字符) 两者都有索引。 我想按 city_name 进行大小写独立搜索。 我知道我可以使用like但这不是很有效。 一种方法是将 city_name 的大写变体存储在另一个字段中。 但我不禁认为应该有一种方法可以使用 charset 或 collation 来做到这一点。 有人可以指出我正确的方向吗? mysql case 1 个回答 Voted Best Answer Vérace 2015-07-26T23:12:03+08:002015-07-26T23:12:03+08:00 使用 没有问题LIKE,只要它的格式如下: SELECT * FROM My_Table WHERE City_Name LIKE 'Abc%'; 这可以使用索引。但是,以下不能。 SELECT * FROM My_Table WHERE City_Name LIKE UPPER('Abc%'); 使用函数 ( UPPER()) 否定索引 - 在技术术语中,查询不是sargable. 请注意,在以下情况下,查询也是不可搜索的: SELECT * FROM My_Table WHERE City_Name LIKE '%Abc..'; 搜索字符串开头的通配符使任何索引都不起作用。 ON INSERT 和 ON UPDATE 触发器进入新字段 (up_City_Name),将输入 City_Name 设置为 UPPER(input City_Name)。 这样,您将始终知道您的 City_Name 是大写的,并且您的服务器将始终能够使用索引,前提是您在新字段 up_City_Name 上进行搜索。
使用 没有问题
LIKE
,只要它的格式如下:SELECT * FROM My_Table WHERE City_Name LIKE 'Abc%';
这可以使用索引。但是,以下不能。
SELECT * FROM My_Table WHERE City_Name LIKE UPPER('Abc%');
使用函数 (
UPPER()
) 否定索引 - 在技术术语中,查询不是sargable
. 请注意,在以下情况下,查询也是不可搜索的:SELECT * FROM My_Table WHERE City_Name LIKE '%Abc..';
搜索字符串开头的通配符使任何索引都不起作用。
ON INSERT 和 ON UPDATE 触发器进入新字段 (up_City_Name),将输入 City_Name 设置为 UPPER(input City_Name)。
这样,您将始终知道您的 City_Name 是大写的,并且您的服务器将始终能够使用索引,前提是您在新字段 up_City_Name 上进行搜索。