我正在使用JPA Criteria API,我想选择我有一个像给定字符串这样的列数据的事件,这就是我在SQL中的做法:
lower(CONVERT(myTable.lib, 'US7ASCII')) like lower('%'+myString+'%')
例如,我有myTable.Lib = 'métier'
行,所以当myString
的值为'met'
时,它应该选择返回该行,因为在这种情况下CONVERT(myTable.Lib, 'US7ASCII')
将返回{ {1}}。
这就是我建立标准的方式:
'metier'
我该如何解决这个问题?
答案 0 :(得分:1)
试试这个:
builder.like(builder.lower(builder.function("convert",String.class,join.get(myTable.lib),builder.literal("US7ASCII"))),"%" + search.toLowerCase() + "%"));
答案 1 :(得分:-1)
方法CONVERT(..., ...)
不是ANSI SQL标准语法,但它是ODBC,以及US7ASCII字符集Oracle's doc
标准语法为CONVERT(... USING ...)
第二个问题是数据库在转换时的行为方式。
如果您在Oracle DB上运行简单查询
select CONVERT('àèìòù', 'US7ASCII') from DUAL;
你会收到
aeiou
由于缺少US7ASCII字符集,因此无法运行MySQL中的相同查询。根据Oracle的文档,它的标准对应物是ASCII,但不幸的是简单查询
select CONVERT("àèìòù" USING ASCII)
返回null
现在,考虑到问题,正如我之前所说,使用函数搜索数据是一个非常糟糕的主意,因为它会极大地影响您的查询性能。 在我看来,你应该为你的表选择正确的整理。
collation是字符排序和比较的方式。对表(或列或数据库)使用欧洲排序规则或utf8排序规则将确保重音字符的排序和比较与非重音字符相同,最重要的是,您不需要任何其他功能来搜索查询。