1

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

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

4

1 回答 1

2

我找到了我的问题的答案。为了让我想要的结果发挥作用,我必须做两件事:

  1. 添加 icu4j 作为项目的依赖项,使 H2 使用 ICU4J 整理器。

     testCompile 'com.ibm.icu:icu4j:55.1'
    

这在文档H2 DB Reference-SET COLLATION中有所提及。(它没有解释默认整理器和 ICU4J 之间的区别。

  1. 将 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”的名称视为与没有变音符号的名称不同。

于 2016-11-22T06:00:43.893 回答