Skip to content

Instantly share code, notes, and snippets.

@wtnabe
Created Mar 7, 2021
Embed
What would you like to do?
PostgreSQL 12のcollationの動作確認。columnかorder byにcollateを付与して利用する。アルファベットの大文字小文字の順番はcreate collateするしかなさそう。

PostgreSQL 12 collation behavior verification

Procedure

  1. git clone
  2. mkdir pgdata
  3. docker-compose run -e POSTGRES_PASSWORD=password postgres
  4. docker-compose up
  5. psql -h localhost -U postgres -f ./create_database.sql
  6. psql -h localhost -U postgres -f ./create_table.sql collation_practice
  7. psql -h localhost -U postgres -f ./create_data.sql collation_practice

Results

# select * from sample_table order by name1 asc;

( collate "en_US.UTF8" is similar to collate "C" )

     name1      |     name2
----------------+----------------
  B             |  B
 A              | A
 B              | B
 a              | a
 b              | b
 あ             | あ
 あいうえお     | あいうえお
 あーいうえお   | あーいうえお
 い             | い
 いろは         | いろは
 いろはにほへと | いろはにほへと
 ア             | ア
(12 rows)
# select * from sample_table order by name2 asc;
     name1      |     name2
----------------+----------------
  B             |  B
 a              | a
 A              | A
 b              | b
 B              | B
 あ             | あ
 ア             | ア
 あーいうえお   | あーいうえお
 あいうえお     | あいうえお
 い             | い
 いろは         | いろは
 いろはにほへと | いろはにほへと
(12 rows)
# select * from sample_table order by name1 COLLATE "ja-JP-x-icu" asc;
     name1      |     name2
----------------+----------------
  B             |  B
 a              | a
 A              | A
 b              | b
 B              | B
 あ             | あ
 ア             | ア
 あーいうえお   | あーいうえお
 あいうえお     | あいうえお
 い             | い
 いろは         | いろは
 いろはにほへと | いろはにほへと
(12 rows)
INSERT INTO sample_table (name1, name2) VALUES
('', ''),
('', ''),
('', ''),
('a', 'a'),
('A', 'A'),
('b', 'b'),
('B', 'B'),
(' B', ' B'),
('いろは', 'いろは'),
('いろはにほへと', 'いろはにほへと'),
('あいうえお', 'あいうえお'),
('あーいうえお', 'あーいうえお');
CREATE DATABASE collation_practice
ENCODING 'UTF8';
CREATE TABLE sample_table (
name1 VARCHAR(50) NOT NULL,
name2 VARCHAR(50) NOT NULL COLLATE "ja-x-icu"
);
version: "3"
services:
postgres:
image: postgres:12-alpine
ports:
- "5432:5432"
volumes:
- ./dbdata:/var/lib/postgresql/data
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment