H2数据库可以使用哪种排序规则,它不会忽略空格,但同时会识别带有变音符号的字符而不是相同的字符串?
例如,它应该将“IlkkaSeppälä”和“Ilkka Seppala”视为相同。它还需要将“MSaifAsif”和“M Saif Asif”视为不同(因为空格)
答案 0 :(得分:2)
我找到了问题的答案。为了实现我想要的结果,我必须做两件事:
将icu4j添加为项目的依赖项,使H2使用ICU4J整理程序。
testCompile 'com.ibm.icu:icu4j:55.1'
文档H2 DB Reference - SET COLLATION 中提到了这一点。 (虽然默认的整理者和ICU4J之间存在差异,但这并没有解释。
将SET COLLATION ENGLISH STRENGTH PRIMARY添加到JDBC网址:
jdbc:h2:mem:test; MODE = MySQL; INIT = CREATE SCHEMA如果不存在“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个断言将失败,因为它会将带空格的String视为与没有空格的String相同。如果没有SET COLLATION,第二个断言就会失败,因为它会将带有变音符号的字母“a”视为不带有变音符号的名称。