- - PR -
SQL Server 2000 はNULLとゼロバイト空白が区別されるんですね!
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2004-06-12 17:46
こんにちわ。
SQL Serverの空白の扱いについてとても困っています...; LEN関数で空白を数えることができませんし、パターン検索では空白の全角と半角が区別できません。 半角空白の桁数を確認するのに、LEN関数は使用できないのでしょうか? パターン検索で空白の全角と半角の区別はできないのでしょうか? また、SQL Serverではゼロバイト空白とNULL値は区別されるようなのですが、区別しないようにするサーバーオプションなどはあるのでしょうか? どうぞよろしくお願いします。 この問題を確認するために、次のようなSQL文を実行してみました。 以下、実行結果とともにご参照ください。 create table test (a char(2) , b varchar(40)) 【NULL】insert into test values('1' , NULL) 【0バイト空白】insert into test values('2' , '') 【3バイト空白】insert into test values('3' , ' ') 【全角3桁空白】insert into test values('4' , ' ') 【(左に3バイト空白)LeftSpace】insert into test values('5' , ' LeftSpace') 【RightSpace(右に3バイト空白)】insert into test values('6' , 'RightSpace ') select a , b ,len(b) lenの結果 From test a b lenの結果 ---- ------------------------------ ----------- 1 NULL NULL 2 0 3 0 4 3 5 LeftSpace 12 6 RightSpace 10 (6 件処理されました) 【条件:NULL】 select a,b From test where b is null a b ---- ------------------------------ 1 NULL (1 件処理されました) 【条件:0バイト空白】 select a,b From test where b ='' a b ---- ------------------------------ 2 3 4 (3 件処理されました) 【条件:1バイト空白】 select a,b From test where b =' ' a b ---- ------------------------------ 2 3 4 (3 件処理されました) 【条件:3バイト空白】 select a,b From test where b =' ' a b ---- ------------------------------ 2 3 4 (3 件処理されました) 【条件:全角3桁空白】 select a,b From test where b =' ' a b ---- ------------------------------ 2 3 4 (3 件処理されました) 【条件:(左に3バイト空白)LeftSpace】 select a,b From test where b =' LeftSpace' a b ---- ------------------------------ 5 LeftSpace (1 件処理されました) 【条件:RightSpace(右に3バイト空白)】 select a,b From test where b ='RightSpace ' a b ---- ------------------------------ 6 RightSpace (1 件処理されました) 【条件:パターン検索で、 0個以上の任意の文字列+3バイト空白】 select a,b From test where b like '% ' a b ---- ------------------------------ 3 4 6 RightSpace (3 件処理されました) 【条件:パターン検索で、 0個以上の任意の文字列+6バイト空白】 select a,b From test where b like '% ' a b ---- ------------------------------ (0 件処理されました) 【条件:パターン検索で、 3バイト空白+0個以上の任意の文字列】 select a,b From test where b like ' %' a b ---- ------------------------------ 3 4 5 LeftSpace (3 件処理されました) 【条件:パターン検索で、 6バイト空白+0個以上の任意の文字列】 select a,b From test where b like '% ' a b ---- ------------------------------ (0 件処理されました) |
|
投稿日時: 2004-06-12 17:57
さきほどの書き込みを補足します。
「SQL Server 2000 はNULLとゼロバイト空白が区別されるんですね!」と書かせていただいたのは、「ORACLEと違って、」ということです。 ことば足らずでどうもすみませんでした...;;; 余談ですが、ORACLEで確かめた結果を載せたいと思います。 SQL> create table test (a char(2) , b char(20)); 表が作成されました。 SQL> insert into test values('1' , NULL); 1行が作成されました。 SQL> insert into test values('2' , ''); 1行が作成されました。 SQL> insert into test values ('3', ' '); 1行が作成されました。 SQL> insert into test values ('4', ' '); 1行が作成されました。 SQL> select * from test where b is null; A B -- -------------------- 1 NULL 2 NULL SQL> select * from test where b = ''; レコードが選択されませんでした。 SQL> select * From test where b like ' '; A B -- -------------------- 3 SQL> select a , length(b) from test; A LENGTH(B) -- ---------- 1 NULL 2 NULL 3 20 4 17 SQL> ORACLEでは、NULLもゼロバイト空白もNULL値として扱われますね。 |
|
投稿日時: 2004-06-12 19:15
米田です。
なんというか、混沌とした状況に持ち込んでいるようですね。 >SQL Serverの空白の扱いについてとても困っています...; >LEN関数で空白を数えることができませんし、パターン検索では空白の全角と半角 >が区別できません。 >半角空白の桁数を確認するのに、LEN関数は使用できないのでしょうか? >パターン検索で空白の全角と半角の区別はできないのでしょうか? >また、SQL Serverではゼロバイト空白とNULL値は区別されるようなのですが、 >区別しないようにするサーバーオプションなどはあるのでしょうか? 拝見する限り、 ・ varchar ではなく、nvarchar で試す。 ・「全角と半角の区別」は照合順序で制御するので、局所的には COLLATE 句で切り替える。 (確か Japanese_BIN がもっとも区別します) ・NULL値は 3値論理で、区別するためにあるので、ゼロバイト空白と同一視してかまわないのであれば、かならずフィールド定義を NOT NULL DEFAULT '' とし、NULL値はさける。 この方法で一度評価してみてください。 (個別には Books Online を参照してください) |
|
投稿日時: 2004-06-12 22:37
よねださん、アドバイスありがとうございます。
検証した結果、次のことが分かりました。 varcharでもnvarcharでもJapanese_BINであれば、大文字小文字の区別をつけて、全角半角の区別もつける。 varcharでもnvarcharでもJapanese_CI_ASであれば、大文字小文字の区別をつけず、全角半角の区別もつけない。 したがいましておっしゃるとおり、 ・「全角と半角の区別」は照合順序で制御するので、局所的には COLLATE 句で切り替える。 ・NULL値は 3値論理で、区別するためにあるので、ゼロバイト空白と同一視してかまわないのであれば、かならずフィールド定義を NOT NULL DEFAULT '' とし、NULL値はさける。 をルール付けするようにいたします。 どうもありがとうございました。 |
1
