「_」(アンダースコア)が「-」(ハイフン)と一致するのはなぜですか。


110

このクエリを使用してPDFマニュアルを探す必要があります。

root@localhost:test> select * from a where name like '%taz_manual%.pdf%';
+--------------------+------------------+-------------+
| name               | description      |        size | 
+--------------------+------------------+-------------+
| taz-manual-1.1.pdf | Manual v1.0 TA-Z |    31351902 |
| taz-manual-0.2.pdf | Manual v1.0 T1-A |     3578278 |
| taz_manual-2.0.pdf | Manual v2.0 GA-X |   542578278 |
etc........
+--------------------+------------------+-------------+
132 row in set (0.00 sec)

名前を指定すると、なぜダッシュのあるものが表示されるのtaz_manual%.pdfですか?

回答:


231

アンダースコア_は、%1文字だけを検索することを除いて、percentのようなワイルドカードだからです。

SQLパターンマッチングでは、「_」を使用して任意の1文字に一致させ、「%」を使用して任意の数の文字(ゼロ文字を含む)に一致させることができます。

(MySQLドキュメントのセクション3.3.4.7。パターンマッチングから。)

下線をlikeリテラルとして使用する場合は、エスケープする必要があります。

select * from a where name like '%taz\_manual%.pdf%';

これは、パターンコンテキストにいる場合にのみ関係します。例えばLIKEステートメントの中。すべて_-:に置き換える場合UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';。内部LIKEでエスケープし、内部でエスケープしないことに注意してくださいREPLACE。(ただし、replace内のパターンコンテキストに含まれていないのは奇妙だと思います...)
Hafenkranich

mysql文書の@Hafenkranich:「LIKEまたはNOT LIKE比較演算子を使用する」
ゼウス書

2

文字列を完全一致で照合するときに、スペースとハイフンで同様の問題が発生しました。

SELECT id FROM location WHERE name = 'IND - HQ';

上記のクエリは、MySQLでレコードを返しませんでした。次のように、スペースとハイフンをエスケープし、LIKE等号(=)との完全一致の代わりに使用する必要がありました。

SELECT id FROM location WHERE name LIKE 'IND_\-_HQ';

これは関連していますか?たぶん、この正確な名前の場所の行はありませんでした... ???
Nico Haase

はい、location = 'IND-HQ'の行があり、上記は直面した問題を修正しました
NBhat

そして、あなたが答えを投稿する5年前にこの質問をした人に尋ねたので、あなたは知っていますか?
ニコ・ハーセ2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.