- PR -

SQL Server 2000 はNULLとゼロバイト空白が区別されるんですね!

1
投稿者投稿内容
あき
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 72
投稿日時: 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 件処理されました)
あき
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 72
投稿日時: 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値として扱われますね。
よねだ
常連さん
会議室デビュー日: 2002/10/13
投稿数: 22
投稿日時: 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 を参照してください)
あき
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 72
投稿日時: 2004-06-12 22:37
よねださん、アドバイスありがとうございます。

検証した結果、次のことが分かりました。
varcharでもnvarcharでもJapanese_BINであれば、大文字小文字の区別をつけて、全角半角の区別もつける。
varcharでもnvarcharでもJapanese_CI_ASであれば、大文字小文字の区別をつけず、全角半角の区別もつけない。

したがいましておっしゃるとおり、
・「全角と半角の区別」は照合順序で制御するので、局所的には COLLATE 句で切り替える。
・NULL値は 3値論理で、区別するためにあるので、ゼロバイト空白と同一視してかまわないのであれば、かならずフィールド定義を NOT NULL DEFAULT '' とし、NULL値はさける。
をルール付けするようにいたします。

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)