"_"(밑줄)이 "-"(하이픈)과 일치하는 이유는 무엇입니까?


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

밑줄 _%하나의 문자 만 찾는 것을 제외하고 는 percent와 같은 와일드 카드 이기 때문입니다.

SQL 패턴 일치를 사용하면 "_"를 사용하여 단일 문자를 일치시키고 "%"를 사용하여 임의의 문자 수 (0 개 문자 포함)를 일치시킬 수 있습니다.

(섹션 3.3.4.7. MySQL 문서의 패턴 매칭 .)

밑줄을 like리터럴로 사용하려면 이스케이프해야합니다.

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

afaik 이것은 패턴 컨텍스트에있을 때만 관련이 있습니다. 예를 들어 LIKE문장 내부 . 모두 _-: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. 내부 탈출 LIKE및 내부 탈출 없음을 확인하십시오 REPLACE. (나는 ... 당신이 내 대체 패턴 컨텍스트에없는 것을 그것은 이상한 생각을 찾을 수)
Hafenkranich

"는 LIKE 또는 NOT LIKE 비교 연산자를 사용하여"MySQL의 문서에서 @Hafenkranich
제우스의 예약

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 년 전에이 질문을 한 사람에게 물었 기 때문에 알고 있습니까?
Nico Haase 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.