web-dev-qa-db-ja.com

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

このクエリを使用して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に指定すると、なぜダッシュ付きのものが表示されるのですか?

110
E.G.

アンダースコア_はパーセントのようなワイルドカードです%、ただし1文字のみを検索することを除きます。

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

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

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

select * from a where name like '%taz\_manual%.pdf%';
231
Book Of Zeus

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

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

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

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