どうも、nippaです。
今回はPostgreSQLに日本語入力できるように設定したいと思います。
個人的には、日本語にすると文字のバイト数等が変化するので、SQLに影響があるのかなと思っています。
致し方ない時以外は、C.UTF-8
で良いのかなと思っています。
1. OSのlocaleの確認
localeについては、arch Linuxのページがわかりやすいです。
localeは、テキストのレンダリング、日時表現、地域通貨の表示方法、アルファベットなどの決まり事を設定します。
localeの設定は、[言語]_[地域].[コードセット]で記載されます。コードセットはここでは、エンコーディングとしての理解で良いです。
OS側で日本語用のlocaleでが生成されていない場合は、Databaseで指定することができません。
現在のlocaleの確認は、
locale
で行います。localeで日本語を指定しなくともDatabase上では指定できます。
利用可能なlocaleは
locale -a
で確認できます。
既に生成されているlocaleは
localedef --list-archive # または、 localectl list-locales
で確認することができます。
localeが生成されていな場合は、生成されているが利用できない場合は、
/etc/locale.gen
の利用するlocaleのコメントアウトを外します。
vim /etc/locale.gen # ja_JP.UTF-8 のコメントアウトを外す ... # ja_JP.EUC-JP EUC-JP ja_JP.UTF-8 UTF-8 # ka_GE GEORGIAN-PS # ka_GE.UTF-8 UTF-8 ...
localeを有効にするために、
locale-gen
を実行し、生成します。
生成した、localeをpostgreSQLで有効化するために、postgreSQLを再起動します。
2. Database作成時での設定
Database作成時に、localeとctypeを指定することができます。
LC_CTYPEでは、文字の分類および大文字/小文字の変換のルールを指定します。
CREATE DATABASE test01 OWNER = postgres TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'ja_JP.UTF-8' LC_CTYPE = 'ja_JP.UTF-8';
3. 既存のDatabaseのlocaleを変更する
既存のDatabaseではソート順に影響があるため、locale、ctypeを変更することができません。
そのため、Databaseをダンプし、Databaseを作成し直して、データをrestoreする必要があります。
3.1 Databaseのダンプ
pg_dumpallコマンドを使って、Databaseをすべてダンプすることができます。
pg_dumpall -f [file name]
変更するDatabaseのみdumpする場合は、pg_dumpコマンドを利用します。
pg_dump [Database名] -C -f [file name]
3.2 Databaseのlocaleを変更
-C
でCreate DatabaseのSQLも含まれる。SQLのCreate Database文を
ENCODING = 'UTF8' LC_COLLATE = 'ja_JP.UTF-8' LC_CTYPE = 'ja_JP.UTF-8';
に変更します。
3.3 Databaseのリストア
pg_restoreコマンドを使って、Databaseをリストアします。
pg_restore -d [database] -c [file name]
-d
はリストア前に、DatabaseをDropするオプションになります。
感想
既存のDatabaseのLocaleの変更はかなりめんどくさいです。
なので、構築時にしっかり設計することをオススメします。
ではでは、また次回。