0

我正在使用 JPA Criteria API,并且我想选择我有像给定字符串这样的列数据的出现,这就是我在 SQL 中的操作方式:

 lower(CONVERT(myTable.lib, 'US7ASCII')) like lower('%'+myString+'%')

例如,我有一行 where myTable.Lib = 'métier',所以当 is 的值时myString'met'应该选择返回该行,因为CONVERT(myTable.Lib, 'US7ASCII')在这种情况下将返回'metier'

这就是我建立标准的方式:

builder.like(builder.lower(join.get(myTable.lib)),"%" + search.toLowerCase() + "%"));

我该如何解决这个问题?

4

2 回答 2

1

尝试这个:

builder.like(builder.lower(builder.function("convert",String.class,join.get(myTable.lib),builder.literal("US7ASCII"))),"%" + search.toLowerCase() + "%"));
于 2018-02-19T10:56:29.393 回答
-1

该方法CONVERT(..., ...)不是ANSI SQL标准语法,而是ODBC,以及US7ASCII字符集Oracle的doc

标准语法是CONVERT(... USING ...)

第二个问题是数据库如何处理转换。

如果您在 Oracle DB 上运行简单查询

select CONVERT('àèìòù', 'US7ASCII') from DUAL;

您将收到

aeiou

由于缺少 US7ASCII 字符集,无法在 MySQL 中运行相同的查询。根据 Oracle 的文档,其标准对应物是 ASCII,但不幸的是简单查询

select CONVERT("àèìòù" USING ASCII)

返回null

现在,考虑到问题,正如我之前所说,使用函数搜索数据是一个非常糟糕的主意,因为它会极大地影响您的查询性能。在我看来,您应该为您的表格选择正确的排序规则。

排序规则是字符排序和比较的方式。为您的表(或列或数据库)使用欧洲排序规则或 utf8 排序规则将确保重音字符与非重音字符一样进行排序和比较,最重要的是,您的搜索不需要任何附加功能询问。

于 2018-02-19T15:12:39.363 回答