java - H2 DB 校对

标签 java h2 collation icu4j

H2 数据库可以使用哪种排序规则,既不忽略空格,又同时识别带变音符号和不带变音符号的字符?

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

最佳答案

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

  1. 将 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/

    相关文章:

    java - 复制值TableColumn不可见的问题

    java - Android - 构造函数变量中的空指针异常

    c# - 连接到H2数据库

    php - 尝试了几件事后,得到特殊字符的问号。我还能尝试什么?

    mysql - H2 是否支持单个列的排序规则定义?

    java - 在 Java 中将 int[] 转换为 List<Integer> 的最佳方法?

    java - 基于复杂匹配键的多个属性分组和聚合

    database - Slick 3 - 基于其他表以事务方式插入到多个表中

    java - 从指定路径访问h2数据库

    azure - SQL Azure 排序规则