H2 DB整理

时间:2016-11-21 15:19:40

标签: java h2 collation icu4j

H2数据库可以使用哪种排序规则,它不会忽略空格,但同时会识别带有变音符号的字符而不是相同的字符串?

例如,它应该将“IlkkaSeppälä”和“Ilkka Seppala”视为相同。它还需要将“MSaifAsif”和“M Saif Asif”视为不同(因为空格)

1 个答案:

答案 0 :(得分:2)

我找到了问题的答案。为了实现我想要的结果,我必须做两件事:

  1. 将icu4j添加为项目的依赖项,使H2使用ICU4J整理程序。

     testCompile 'com.ibm.icu:icu4j:55.1'
    
  2. 文档H2 DB Reference - SET COLLATION 中提到了这一点。 (虽然默认的整理者和ICU4J之间存在差异,但这并没有解释。

    1. 将SET COLLATION ENGLISH STRENGTH PRIMARY添加到JDBC网址:

      jdbc:h2:mem:test; MODE = MySQL; INIT = CREATE SCHEMA如果不存在“public”\; SET COLLATION ENGLISH STRENGTH PRIMARY

    2. 我的单元测试的片段在添加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”视为不带有变音符号的名称。