Azure Database for PostgreSQLでCollation(照合順序)を指定してCREATE DATABASEしたい
というお困り状態を見かけたので。
これまで使っていたCREATE DATABASEをAzureのPostgreSQLに発行すると「ERROR: invalid locale name: "ja_JP.utf8"」となってしまう場合があるようです。
postgres=> CREATE DATABASE my_new_database ENCODING='UTF8' LC_COLLATE='ja_JP.utf8' LC_CTYPE='ja_JP.utf8'; ERROR: invalid locale name: "ja_JP.utf8"
これはPostgreSQLがWindows上で動いているのが原因のようで、エンコーディングを「UTF8」とする場合、COLLATIONの日本語ロケールは「Japanese_Japan.932」を指定すると良いようです。
ロケール(国際化と地域化) | Let's Postgres
Windows で UTF8 エンコーディングを使う場合のみ、ロケールのエンコーディングにコードページ 932 (SJIS) を使うことができます。これは Windows の C ライブラリが UTF8 でのロケール処理をサポートしていないためで、PostgreSQL 側で専用の対応を行っています。
だそうです。SQLで書くとこんな感じです。
postgres=> CREATE DATABASE my_new_database ENCODING='UTF8' LC_COLLATE='Japanese_Japan.932' LC_CTYPE='Japanese_Japan.932' TEMPLATE='template0';
ちなみに、ロケールを指定しない場合のデフォルトは「English_United States.1252」となってました。
せっかくなので、Azure Database for PostgreSQL 上でいくつかの照合順序を指定して、実際にどのような並びになるのか簡単に試してみました。
Japanese_Japan.932 | English_United States.1252 | C |
---|---|---|
う | う | う |
ヴ | ヴ | う゛ |
う゛ | う゛ | は |
ハ | ハ | ば |
は | は | ぱ |
バ | バ | ハ |
ば | ば | バ |
パ | パ | パ |
ぱ | ぱ | ヴ |
#これだけ見るとデフォルト(English_United States.1252)でいいんじゃ?って気にならなくもない。