I’m trying to sort column data in my h2 database, but it isn’t correct.
I think that change of collation may help. I tried to set collation in datasource url in many ways e.g.:
spring.datasource.url = jdbc:h2:mem:testdb;COLLATION='ENGLISH'
spring.datasource.url = jdbc:h2:mem:testdb;SET COLLATION='EN''
spring.datasource.url = jdbc:h2:mem:testdb;SET COLLATION ENGLISH STRENGTH PRIMARY'
And I’m still have an syntax error like this Syntax error in SQL statement "SET COLLATION 'ENGLISH'[*]"; expected "identifier"; SQL statement:
SET COLLATION 'ENGLISH' [42001-200]
Am I doing something wrong? Or there is some other way to solve my problem? Thanks in advance!
Advertisement
Answer
H2 Console uses browser’s sorting capabilities provided by simple Array.sort()
, they aren’t affected by collation setting of H2. I created a feature request for this problem:
https://github.com/h2database/h2database/issues/2694
The URL jdbc:h2:mem:testdb;COLLATION=POLISH
is correct. You can test that it works:
SELECT * FROM (VALUES 'AAAAAA', 'LLLLLLLLL', 'ZZZZZZ', 'ĄĄĄĄĄĄ', 'ŁŁŁŁŁŁ') T(V) ORDER BY V; > V > --------- > AAAAAA > ĄĄĄĄĄĄ > LLLLLLLLL > ŁŁŁŁŁŁ > ZZZZZZ
Without POLISH collation result will be just like on yours screenshot.
So the oblivious workaround is to append ORDER BY BUILDINGS_NUMBER
to your query.
Note that there are different strength levels of collation. For example, for SECONDARY
you can use jdbc:h2:mem:testdb;COLLATION=POLISH STRENGTH SECONDARY
. See documentation for more details:
https://h2database.com/html/commands.html#set_collation