浅草橋青空市場

Microsoft Azure のニュースや情報を中心にあれこれと

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"

これはPostgreSQLWindows上で動いているのが原因のようで、エンコーディングを「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)でいいんじゃ?って気にならなくもない。