本エントリはFirebird Adventcalendar 2016の10日目です。
使い慣れたSQLに潜む実装依存:2.データ型と演算子 INSERT時のスペース
ここでもFirebirdは多数側、つまりOracleとVertica以外のRDBMSと同じ結果を返します。
SQL> create table table1(c1 char(3),c2 varchar(3));
SQL> insert into table1 values('ABC ','AB ');
SQL> select * from table1;
C1 C2
====== ======
ABC AB
ちょっとわかりにくいので、c2にちゃんと後続のスペースがついているかどうか確認すると。。。
SQL> select octet_length(c1),octet_length(c2) from table1;
OCTET_LENGTH OCTET_LENGTH
============ ============
3 3
まぁOracleではきっとchar型でも後続のスペースをとらずに入れようとして
カラム定義長にひっかかっているのでしょうか?
ただ、VARCHARにちゃんと後続の空白付で入ったからといって、油断をしてはなりません。
Firebirdは(そしてMySQLも)文字列比較セマンティクスは「空白埋め」だからです。
そのため、たとえばc2にユニーク制約をつけると、'AB 'が入っているカラムに
'AB'はインサートできません。ユニーク制約違反になります。詳細はMySQL用に書いた
以下のブログをご参照ください。
MySQLの文字列比較セマンティクスは「空白埋め」
使い慣れたSQLに潜む実装依存:2.データ型と演算子 INSERT時のスペース
ここでもFirebirdは多数側、つまりOracleとVertica以外のRDBMSと同じ結果を返します。
SQL> create table table1(c1 char(3),c2 varchar(3));
SQL> insert into table1 values('ABC ','AB ');
SQL> select * from table1;
C1 C2
====== ======
ABC AB
ちょっとわかりにくいので、c2にちゃんと後続のスペースがついているかどうか確認すると。。。
SQL> select octet_length(c1),octet_length(c2) from table1;
OCTET_LENGTH OCTET_LENGTH
============ ============
3 3
まぁOracleではきっとchar型でも後続のスペースをとらずに入れようとして
カラム定義長にひっかかっているのでしょうか?
ただ、VARCHARにちゃんと後続の空白付で入ったからといって、油断をしてはなりません。
Firebirdは(そしてMySQLも)文字列比較セマンティクスは「空白埋め」だからです。
そのため、たとえばc2にユニーク制約をつけると、'AB 'が入っているカラムに
'AB'はインサートできません。ユニーク制約違反になります。詳細はMySQL用に書いた
以下のブログをご参照ください。
MySQLの文字列比較セマンティクスは「空白埋め」
JUGEMテーマ:コンピュータ