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,则第 4 个断言将失败,因为它将带空格的字符串与不带空格的字符串一样对待。如果没有 SET COLLATION,第二个断言将失败,因为它会将带有变音符号的字母“a”的名称视为与没有变音符号的名称不同。