【发布时间】: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 建议了一个问题的链接,其中包含对 cmets 中相关问题的答案。我已经尝试了这两个建议(在创建表之前使用 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
【问题讨论】:
-
@AndrewMorton ...也许,是的。看起来 VARCHAR_IGNORECASE 类型可以工作。将不得不检查
-
@AndrewMorton - 不幸的是,没有。
locate似乎忽略了这两个设置,也忽略了连接 URL 中的IGNORECASE=TRUE设置。 -
我看到h2database - issue #591 INSTR behaves case sensitive on VARCHAR_IGNORECASE column 被标记为“WontFix”。也许您可以查看其他 H2 issues 以查看
locate是否已被注意到具有相同的行为。 -
H2 可能是数据库的次优选择,几乎任何其他 RDBMS(包括 MySQL)都会更好。
标签: sql h2 case-sensitive