Quantcast
Channel: Planet MySQL
Viewing all articles
Browse latest Browse all 1081

使い慣れたSQLに潜む実装依存: Firebirdの場合(7) INSERT時のスペース

$
0
0
本エントリはFirebird Adventcalendar 2016の10日目です。

使い慣れたSQLに潜む実装依存:2.データ型と演算子 INSERT時のスペース

ここでもFirebirdは多数側、つまりOracleとVertica以外のRDBMSと同じ結果を返します。

SQL&gt create table table1(c1 char(3),c2 varchar(3));
SQL&gt insert into table1 values('ABC ','AB ');
SQL&gt select * from table1;

C1 C2
====== ======
ABC AB

ちょっとわかりにくいので、c2にちゃんと後続のスペースがついているかどうか確認すると。。。

SQL&gt 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テーマ:コンピュータ




Viewing all articles
Browse latest Browse all 1081

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>