文字コードがテンプレートの ENCODING と異なるデータベースを作成するためにTEMPLATE template0 を追加する SQL の例
CREATE DATABASE testdb WITH OWNER testuser ENCODING 'UTF8' TEMPLATE template0;
よく使う SQL は、DB、ユーザ、ユーザにパスワードを設定する SQL でございまして、次はその例ですの♪
-- ユーザの作成(スーパーユーザ無効、DB作成無効、ユーザ作成無効、パスワード設定)。データベースの作成 -- デフォルト ENCODING と異なる文字コードでDB作成する場合は、TEMPLATE template0 を追加 CREATE USER testuser WITH NOSUPERUSER NOCREATEDB NOCREATEROLE PASSWORD 'testpassword'; CREATE DATABASE testdb WITH OWNER testuser ENCODING 'UTF8';
PostgreSQL 8.4で新しいデータベースを作成しようとしましたら、次のようなエラーとなってできませんでした><。
メッセージはうろ覚えですので間違っているかもしれませんが、大体次のようなメッセージでした。
CREATE DATABASE: database creation failed: ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII) HINT: Use the same encoding as in the template database, or use template0 as template.
あわわ、あわわ、とほうぼう調べ回りましたが、結局のところ、本家ページがもっとも詳細で、充実した解説がなされておりました♪
このページの、「例」の部分です。引用いたします。
ISO-8859-1文字セットをサポートするmusicデータベースを作成します。
CREATE DATABASE music ENCODING 'LATIN1' TEMPLATE template0;この例におけるTEMPLATE template0句は、template1の符号化方式がISO-8859-1ではない場合にのみ必要です。 符号化方式を変更するには同様にLC_COLLATEとLC_CTYPEを新たに設定する必要があるかもしれないことに注意してください。
今回エラーでは、template1 データベースの ENCODING に SQL_ASCII が設定されておりまして、これではない UTF8 を指定したため、エラーとなったでした。
PostgreSQL での文字セットサポートについて、軽く♪
さて、文字コードとして現れた「SQL_ASCII」と「UTF8」、PostgreSQL ではどのように紹介されているのでしょうか?説明ページを見つけることができました。
該当部分のみ、抜書きしてみましょう♪
名前 | 説明 | 言語 | サーバ? | バイト数/文字 | 別名 |
SQL_ASCII | 未指定(テキストを参照) | 何でも | はい | 1 | |
UTF8 | Unicode、8ビット | すべて | はい | 1-4 | Unicode |
…わたくし、言語のところを比較した時、思わずニマッと笑ってしまいましたの。「何でも」と「すべて」はどう異なるのでしょうか?ふふっ。
このページを読んでいきますと、違いが少し説明されておりました。「21.2.3. サーバ・クライアント間の自動文字セット変換」にて、SQL_ASCII は「どれでも (変換されません)」、UTF8 は「すべてサポートされています。」です。
大きな違いです。詳細なイメージは湧きませんけれども、SQL_ASCII は融通が効かず、活躍できるシーンが限られるのではないでしょうか?
もう少し読んでいくと、やはり SQL_ASCII は使いづらい文字コードのようです。
クライアント側のキャラクタセットがSQL_ASCIIに定義されている場合は、符号化変換はサーバ側のキャラクタセットに関係無く無効化されます。 サーバ側と同じように、SQL_ASCIIを使用することは、すべてASCIIのデータを扱っている場合を除き、賢い方法ではありません。
2つの表現の違いは、冗談かと思っておりましたけれども、中身も違うのですわね。。。しみじみします。
最後に、同じような症状に対処したページもございまいた。大変勇気づけれられました、ありがとうございます♪
以上です。