スペースを無視せず、同時にウムラウトを含む文字と含まない文字を同じように認識する H2 データベースで使用できる照合は何ですか?
たとえば、"Ilkka Seppälä" と "Ilkka Seppala" を同じものとして扱う必要があります。また、「MSaifAsif」と「M Saif Asif」を別のものとして扱う必要があります (スペースのため)。
私は自分の質問に対する答えを見つけました。目的の結果を得るには、次の 2 つのことを行う必要がありました。
H2 に ICU4J コレーターを使用させたプロジェクトに icu4j を依存関係として追加します。
testCompile 'com.ibm.icu:icu4j:55.1'
これは、ドキュメントH2 DB リファレンス - 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 がない場合、H2 が SET COLLATION ENGLISH STRENGTH PRIMARY で初期化された場合、4 番目のアサートは、スペースのある文字列をスペースのない文字列と同じように扱うため、失敗していました。SET COLLATION がないと、2 番目のアサートは、ウムラウト付きの文字 "a" を含む名前を含まないものとは異なるものとして扱うため、失敗します。