2015年2月20日金曜日

Redshift の文字列型はバイト単位!?


私の勘違いでなければ、

通常の PostgreSQL の場合、character varying(N) などの N は「文字数単位」ですが、PostgreSQL 8.0.2 から派生した Amazon Redshift の場合は「バイト単位」になるようです。

PostgreSQL ドキュメント 「Character Types」 より抜粋

SQL defines two primary character types: character varying(n) and character(n), where n is a positive integer. Both of these types can store strings up to n characters (not bytes) in length.

Redshift ドキュメント 「Character Types」 より抜粋

CHAR and VARCHAR data types are defined in terms of bytes, not characters.

ですので、UTF-8 で文字データを格納するとした場合、UTF-8 では一文字のバイト数が最大 4 バイトになることを考慮して、「最大文字数 × 4」でカラムを定義しないといけないでしょうね。例えば、最大 100 文字を格納したいのであれば、character varying(400) というカラム定義になります。Unicode や UTF-8 については、「Unicode 理解度簡易チェック」や「文字数、UTF-8 でのバイト数、サロゲートペアの数を数える」も参照してください。

Redshift には、その他にも驚くような PostgreSQL との差異があるので、例えば Primary Key や Unique 制約が無視されたり Index を作れなかったりするので、「Redshift を単なる PostgreSQL の派生物」だと思ってスキーマ設計していると、はまりますね。