RDBが全盛の昨今です。「SQLを押さえれば、すべて賄える」と誤認している開発者を時々見かけます。
SQL92が一般化しいるとはいえ、互換性が低いのは承知の通りです。
特定RDBと特定言語でのみ仕事をしている開発者もいるので、方言しか知らないのは仕方がない事かも知れません。
しかし、それでいいの? とも感じます。SQL Server専門だった開発者にOracleの仕事を回すと、ハマルことが多いようです。
なぜかセットアップ時の、文字コードや照合順序などの定義なども気にしないようで、それが問題を生む原因にもなります。
さすがに、varchar() と varchar2() の差異などは、すぐ気が付くようですwwww。
名簿テーブルの性別の制約の定義で、一悶着ありました。
【MS_SQL】
drop table test;
create table test
(
id nchar(3)
,名前 nvarchar(30)
,性別 nchar(1) check ( 性別 in('F' , 'M' , ''))
);
go
insert into test (id ,名前) values ('bb', 'BBB');
insert into test (id ,名前,性別) values ('a1', 'AAA1','F');
insert into test (id ,名前,性別) values ('a2', 'AAA2','f');
insert into test (id ,名前,性別) values ('a3', 'AAA3','M');
insert into test (id ,名前,性別) values ('a4', 'AAA4','m');
insert into test (id ,名前,性別) values ('a5', 'AAA5','F');
insert into test (id ,名前,性別) values ('a6', 'AAA6','f');
insert into test (id ,名前,性別) values ('a7', 'AAA7','');
insert into test (id ,名前,性別) values ('a8', 'AAA8','@');
go
select * from test;
-- ,性別 nchar(1) constraint check ( 性別 in('F' , 'M'))
go
・照合順はデフォルトのままなので、このケースでは, [a8]さんの,性別='@' の行のみ 跳ねられます。
[bb]さんの性別は nullになり、[a7]さんの性別は、長さ0の文字になります。
ところが Oracle (default設定)では、、大文字小文字は別認識なので、
性別 nchar(1) check ( 性別 in('F' , 'M' ))
とすると, [a1]さんと[a3]さんの二件しか登録できません。...........ここまでは、理解を得られました。
長さ0の文字も許したいようで、設定した、制約は
性別 nchar(1) check ( 性別 in('F' , 'M','' ))
としたらしい。意に反して、制約は働かない。なんでも登録できてしまう。と騒ぎ出した。
Oracleにしてみれば、当然のことですが、オカシイオカシイと悩んでいる。
'' は, nullを意味するので, Check句に ''を含めると、nullと見なされ、ノーチェックになります。
SQL インジェクションを思い出させる出来事でした。
一つのRDBや一つの言語、一つの開発環境しか、知らないと、方言の存在に気付かないと言われます。
開発者は複数のものを使い、方言を認識することで、技量をあげて欲しいところです。
社内開発者だと、そんなのは不要だという声もありますが、寂しいと思うのです。
それにしても、各社のRDBの基本動作の違いは大きすぎる気もします。標準SQLレベルでは、互換性を保って欲しいとツクヅク思います。
その面では、同情すべき面もあるかなぁって感じます。
DB2も癖が強いって聞きます。触ことがありませんが、想像は付きます。
SQL92でもこの程度なので、SQL99/SQL2003の互換性は夢のまた夢なんでしょうね。