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の実行において、=を使って完全一致検索をしているつもりなのですが、
末尾のスペースはその条件を無視してヒットしてしまうものなのでしょうか?
何か情報をお持ちの方がいらっしゃれば、フォローいただけますと幸いです。
Comments
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")
よろしくお願いします。