山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

Redshiftの文字列はバイト数換算

Amazon RedshiftはPostgreSQL互換ですが、多くの違いがあります。異なる点については公式を始めとして各所にまとまっていますが、タイトルの件についてはあまり記載を見なかったのでメモしときます。

PostgreSQLは文字数

SQLは2つの主要な文字データ型を定義しています。 character varying(n)とcharacter(n)です。 ここでnは正の整数です。 これらのデータ型は2つともn文字長(バイト数ではなく)までの文字列を保存できます。

わざわざ、バイト数ではなく と強調して書かれています。

create table hoge(c1 varchar(5));
insert into hoge(c1) values('12345'); -- OK
insert into hoge(c1) values('あいうえお'); -- OK
select * from hoge;

insert into hoge(c1) values('あいうえおa'); -- NG

実際にSQLを実行しても文字数換算です。

Redshiftはバイト数

公式から引用

CHAR および VARCHAR のデータ型は、文字単位でなくバイト単位で定義されます。CHAR 列にはシングルバイト文字のみを含めることができます。したがって、CHAR(10) 列には、最大 10 バイト長の文字列を含めることができます。VARCHAR にはマルチバイト文字 (1 文字あたり最大で 4 バイトまで) を含めることができます。例えば、VARCHAR(12) 列には、シングルバイト文字なら 12 個、2 バイト文字なら 6 個、3 バイト文字なら 4 個、4 バイト文字なら 3 個含めることができます。

こちらも、わざわざ文字単位ではなく と強調して書かれています。

create table hoge(c1 varchar(5));
insert into hoge(c1) values('あいうえお'); -- NG

insert into hoge(c1) values('12345'); -- OK
select * from hoge;

実際にSQLを実行してもバイト数換算です。ちなみに、日本語は3-4バイトになるので注意が必要です。

insert into hoge(c1) values('あ12'); -- OK
insert into hoge(c1) values('あ123'); -- NG

insert into hoge(c1) values('𠮷1'); -- OK
insert into hoge(c1) values('𠮷12'); -- NG

参考