【问题标题】:perform case insensitive string search in H2?在 H2 中执行不区分大小写的字符串搜索?
【发布时间】:2018-09-29 22:05:03
【问题描述】:

我正在使用 H2 运行一些最初设计用于 MySQL 的数据库代码,并且有一些查询需要以不区分大小写的方式匹配数据。我在 JDBC 连接 URL 中找到了“IGNORECASE=TRUE”选项,这在某些情况下有所帮助,但它似乎并不适用于所有地方。例如,在 MySQL 中,我有以下(简化的)查询:

select e.id from entities e left join ranges r on e.range=r.id
 where locate (?, e.name) between r.start and r.end

不幸的是,这在 H2 中不起作用,因为它在执行匹配时区分大小写,我需要它不区分大小写。

H2 是否有一些选项可以更改诸如定位等函数的行为以区分大小写?或者另一个可以做同样工作的功能?在输入参数也更改为小写的情况下运行locate (?, lcase(e.name)) 是否合适,或者在晦涩的极端情况下效率低下或失败?

编辑 @AndrewMortan 建议了一个问题的链接,其中包含对 cme​​ts 中相关问题的答案。我已经尝试了这两个建议(在创建表之前使用 SET COLLATION 命令设置默认排序规则并在需要进行不区分大小写比较的字段中使用“VARCHAR_IGNORECASE”数据类型,不幸的是,这两种方法都不起作用:

create schema test;
set schema test;
set collation en strength primary;
create table test ( t varchar_ignorecase(255) not null );
insert into test(t) values ('THIS SHOULD BE FINDABLE WITH A LOWER CASE SEARCH STRING');
select t, locate('should', t) from test;

产生结果:

T                                    LOCATE('should', T)  
THIS SHOULD BE FINDABLE WITH A ...   0

而:

select t, locate('SHOULD', t) from test;

给予:

T                                    LOCATE('SHOULD', T)  
THIS SHOULD BE FINDABLE WITH A ...   6

【问题讨论】:

标签: sql h2 case-sensitive


【解决方案1】:

您为什么不尝试添加lower() 函数?

select e.id from entities e left join ranges r on e.range=r.id
  where locate (lower(?), lower(e.name)) between r.start and r.end

应该可以,还是我错了?

如果您经常在多行上运行此查询,您可以创建一个虚拟列,如下所示:

alter table element add (
  name_lower varchar(100) as lower(name)
);

所以你的查询会更快:

select e.id from entities e left join ranges r on e.range=r.id
  where locate (lower(?), e.name_lower) between r.start and r.end

什么鬼,你甚至可以按虚拟列索引:

create index ix_element_add_low on element (address_lower);

如果你认为它可以让它更快。

【讨论】:

  • 这不是我很了解的主题,但我的理解是某些 unicode 字符串无法通过强制为大写或小写来正确比较,因为有些字符可能会转换为多个不同的大小写转换的变体。 eev.ee/blog/2015/09/12/dark-corners-of-unicode 给出了一个“ı”的例子,它是土耳其语中“I”的正确小写形式,而“i”是其他语言中正确的小写形式——这个问题的正确解决方案应该能够确定“ı”和“I”是等价的,但我认为这不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
相关资源
最近更新 更多