
WHERE条件の最終桁のスペースについて質問です。
あるテーブルのカラム(colA)に"1234"というデータがあるときに、
(1)SELECT .... WHERE colA='1234'
(2)SELECT .... WHERE colA='1234 ' (1234の後に半角スペース)
(3)SELECT .... WHERE colA='1234 ' (1234の後に全角スペース)
(4)SELECT .... WHERE colA='12345'
を、実行すると、(1)だけOKで、他はNGとなると思い込んでいましたが、
実際は、(2)と(3)も同じように検索されてしまいます。
WHERE条件の最終桁のスペースは無視される?
こういうものなのでしょうか?
オンラインヘルプ等からは、それらしい情報が見つけられなかったのですが、もしこの辺の情報がわかるサイト等ご存知でしたら教えてください。
ちなみに、
SQL-SERVER2005(照合順序:Japanese_CI_AS)
colAは、varchar(20)
です。
p.s.
基本中の基本かもしれませんが、いままでずっと勘違いしていたので、過去の納品してきたお客様の件数を考えて恐ろしくなっています。(T.T)
No.3ベストアンサー
- 回答日時:
> ANSI_PADDING
へえー!
知らなかった。
文字列を厳密に比較するときは、
WHERE colA COLLATE JAPANESE_BIN LIKE '1234 '
みたいに書かないといけないのかな?
>himajin100000さん。
ANSI_PADDING設定は影響しない。ですね。英語苦手です。(~_~;)
あと比較演算子(=,<,>)とLike演算子でも、結果が変わってくるのですね...
>todo36さん。
COLLATE(照合順序)まわりは、私も疑っていたのですが、今回の件では解決できなさそうでした。
まだ少ししか調べていませんが、『比較では後続の空白は無視されます』という規格(ANSI/ISO SQL-92)だと解釈しました。
で、最終桁の半角スペースも含めた検索がある場合には注意が必要だという事だと思います。
逆に、この仕様の方が便利な場合も多いと思いますし...
CONVERT(varbinary, column_Name)
などでバイナリ比較が、手っ取り早い解決策のようです。
今回はいろいろと良い勉強になりました。また、この辺のドキュメント類をきっちり確認する重要性を再認識いたしました。
みなさま、ありがとうございました。
以下に、テストした内容を記しておきます。
CREATE TABLE T1 (id int,colA varchar(10))
GO
INSERT INTO T1 VALUES (1,'1234')
INSERT INTO T1 VALUES (2,'1234 ')--最後に半角スペース
INSERT INTO T1 VALUES (3,'1234 ')--最後に全角スペース
GO
SELECT * FROM T1 WHERE cola = '1234'
--結果ID(1,2,3)
SELECT * FROM T1 WHERE cola = '1234 '--最後に半角スペース
--結果ID(1,2,3)
SELECT * FROM T1 WHERE cola = '1234 '--最後に全角スペース
--結果ID(1,2,3)
SELECT * FROM T1 WHERE cola = '12345'
--結果ID(なし)
SELECT * FROM T1 WHERE cola like '1234%'
--結果ID(1,2,3)
SELECT * FROM T1 WHERE cola like '1234 %'--最後に半角スペース
--結果ID(2,3)
SELECT * FROM T1 WHERE cola like '1234 %'--最後に全角スペース
--結果ID(2,3)
SELECT * FROM T1 WHERE CONVERT(varbinary, colA) = CONVERT(varbinary,'1234 ')--最後に半角スペース
--結果ID(2)
SELECT * FROM T1 WHERE CONVERT(varbinary, colA) = CONVERT(varbinary,'1234 ')--最後に全角スペース
--結果ID(3)
GO
DROP TABLE T1
GO
以上
No.4
- 回答日時:
> ANSI_PADDING
へえー!
知らなかった。
文字列を厳密に比較するときは、
WHERE colA COLLATE JAPANESE_BIN LIKE '1234 '
みたいに書かないといけないのかな?
ご回答ありがとうございます。
先ほど質問締め切ろうかなと思いましたが、
具体例までいただきましたので、もう少し実験してみます。
追って、ご連絡いたします。
No.2
- 回答日時:
INF: How SQL Server Compares Strings with Trailing Spaces
http://support.microsoft.com/kb/316626
関係ある?
#検証はしてない。というかする気がない。

この回答への補足
その後、いろいろ調べた結果、自己解決しました。
ttp://msdn.microsoft.com/ja-jp/library/ms191529.aspx
『比較では後続の空白は無視されます』と明記してありました。
この際、照合順序やUniCodeなどもう少し勉強します。
解決の糸口やきっかけをいただきましたて、どうもありがとうございました。
ご回答ありがとうございます。
URLまで教えていただきありがとうございます。
ANSI_PADDINGについての説明のようです。
この辺の設定は、あまり意識してこなかったので(汗)
関係があるのかもしれません。
少し調べてみます。
No.1
- 回答日時:
そのスペースは「カラム」に属するのであろうがなかろうが無関係ですよ
命令<1つ以上のスペース>オプション<1つ以上のスペース>オプション[以下必要な分のみ」
という書式で、データベースを管理するプログラムそのものは、
スペース区切りに分解してから処理する習性があり、
例としてスペースが間に100個?なんら問題はなかったりします。
ご回答ありがとうございます。
"SELECT"や"GROUP BY"など、各命令やオプションなどは、半角スペース(1個以上)で区切るという事ですね。
今回、それが'1234'や'1234 '(最終桁がスペース)のようにシングルクォーテーションで囲まれた文字列内で起こったので驚いています。
ちなみに、
WHERE colA=' 1234'(最初桁がスペース)
では、正しい動き(検索されない)でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Oracle SQL update方法 2 2022/06/22 14:07
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 日本の全市区町村を人口密度が低 1 2023/06/18 19:51
- MySQL SQLについて教えて下さい。 SELECT分で、あるカラムにある日付の 半年先のデータを取って来たい 3 2022/12/07 22:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
顧客データベースを作る場合、...
-
INSERT文などの列名などの半角...
-
SQLServer2005のストアドプロシ...
-
管理工学研究所のデーターベー...
-
差し込み後、元データを変更し...
-
Outlook 送受信エラー
-
access2021 VBA メソッドまたは...
-
for whichの使い方
-
INSERT文でフィールドの1つだ...
-
フィルターかけた後、重複を除...
-
VBAのAccessでDATE型のINSERT
-
NVLとDECODEのスピード差
-
ACCESS ツリービューの作り方
-
エクセルのxans.について
-
updateでグループ化
-
列のヘッダーを含めるのをデフ...
-
I don't knowを I don't no と...
-
列番号による項目の取得について
-
外部参照してるキーを主キーに...
-
SELECT 文 GROUP での1件目を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
顧客データベースを作る場合、...
-
あいまい検索で英文字の全角半...
-
スペースを検索したい
-
select文のwhere句に配列を入れ...
-
SQLServer2005のストアドプロシ...
-
末尾の全角スペースの削除
-
INSERT文などの列名などの半角...
-
WHERE条件の最終桁のスペースに...
-
ストアドの戻り値で配列を返す方法
-
外部結合で取得した項目にNVL関数
-
SQL SERVER 2005 にて全テーブ...
-
管理工学研究所のデーターベー...
-
DTSパッケージについて
-
Trimの使い方
-
SUBSTR関数の結果が予想と異なる
-
ORACLEの「DECODE」と同じ意味...
-
SQLでUPDATEするときサブクエリ...
-
ストアドプロシージャーの作成方法
-
イコールとノットイコール条件...
-
PHPでPostgreSQLを使う場合
おすすめ情報