質問
· 2023年6月1日

SQLでWHERE句に文字列を指定する時、予期せぬデータがヒットする。

こんにちは、皆さま。
業務でIRISを用いて開発を行っている者です。

IRISにSQLを投げるときの動作について教えてください。

■適当なテーブルを作成
CREATE TABLE Mst.Test (id int, name varchar(10))

■データをINSERT
INSERT INTO Mst.Test VALUES (2, 'bbb ')
※文字列の末尾にスペースを追加。

■SELECT
SELECT * FROM Mst.Test WHERE name = 'bbb'
※whereの条件には末尾のスペースを入れない。

⇒上記の結果、INSERTされたデータがヒットしている。

[疑問点]
SQLの実行において、=を使って完全一致検索をしているつもりなのですが、
末尾のスペースはその条件を無視してヒットしてしまうものなのでしょうか?

何か情報をお持ちの方がいらっしゃれば、フォローいただけますと幸いです。

Product version: IRIS 2022.2
ディスカッション (3)1
続けるにはログインするか新規登録を行ってください

Ohataさん、こんにちは。

SQLでデータが一致するかどうかの判定は照合(collation)によります。
IRISやCacheのデフォルトの照合は%SQLUPPERとなっています。
これは大文字小文字を区別せず、かつ後続の空白は無視されます。
そのため、'bbb△'と'bbb'は同じ文字列と識別され、ヒットします。

照合についてはマニュアルの以下のURLを参照いただければと思います。
https://docs.intersystems.com/iris20221/csp/docbookj/DocBook.UI.Page.cls?KEY=GSQL_COLLATION
 

よろしくお願いします。

Minamoto さん

ご回答いただきありがとうございます!
記載の動作はパラメータの指示によるものだったのですね、、、存じ上げませんでした。

回避しようとすると、EXACTやTRUNCATEを使うのがよさそうですね。
デフォルト値を変えるのが少し怖いですが…。

こちらでも試してみるようにします!

Ohataさん
こんにちは。

デフォルト値を変えるよりも、EXACTの照合が必要なプロパティが限定的なのであれば、
Propertyのデータ型にCOLLATIONパラメータを設定し、それらのプロパティだけ変更
された方が良いかと思います。

Property P1 as %String(COLLATION="Exact")

よろしくお願いします。