H2 数据库可以使用哪种排序规则,既不忽略空格,又同时识别带变音符号和不带变音符号的字符?
例如,应将“Ilkka Seppälä”和“Ilkka Seppala”视为相同。它还需要将“MSaifAsif”和“M Saif Asif”视为不同的(因为空格)
最佳答案
我找到了问题的答案。为了获得我想要的结果,我必须做两件事:
将 icu4j 添加为项目的依赖项,使 H2 使用 ICU4J 整理器。
testCompile 'com.ibm.icu:icu4j:55.1'
文档 H2 DB Reference - SET COLLATION 中提到了这一点。 (它没有解释默认整理器和 ICU4J 之间的区别。
将 SET COLLATION ENGLISH STRENGTH PRIMARY 添加到 JDBC url:
jdbc:h2:mem:test;MODE=MySQL;INIT=CREATE SCHEMA IF NOT EXISTS "public"\;SET COLLATION ENGLISH STRENGTH PRIMARY
我的单元测试片段在添加 ICU4J 后起作用:
@Test
public void testUnicode() throws Exception {
Author authorWithUnicode = new Author();
authorWithUnicode.setName("Ilkka Seppälä");
authorRepository.save(authorWithUnicode);
Author authorWithSpaces = new Author();
authorWithSpaces.setName("M Saif Asif");
authorRepository.save(authorWithSpaces);
assertThat(authorRepository.findByName("Ilkka Seppälä").get()).isNotNull();
assertThat(authorRepository.findByName("Ilkka Seppala").get()).isNotNull();
assertThat(authorRepository.findByName("M Saif Asif").get()).isNotNull();
assertThat(authorRepository.findByName("MSaifAsif")).isEqualTo(Optional.empty());
}
以前,在没有 ICU4J 的情况下,如果使用 SET COLLATION ENGLISH STRENGTH PRIMARY 初始化 H2,第四个断言将会失败,因为它会将带空格的字符串视为与不带空格的字符串相同。如果没有 SET COLLATION,第二个断言将会失败,因为它会将带变音符号的字母“a”的名称视为与不带变音符号的名称不同。
关于java - H2 DB 校对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40723521/