WHERE 절에서 대소 문자 구분 검색을 수행하는 방법은 무엇입니까?


21

SQL 쿼리에서 대소 문자 구분 검색을 원합니다. 그러나 기본적으로 MySQL은 문자열의 경우를 고려하지 않습니다.

SQL 쿼리에서 대소 문자 구분 검색을 수행하는 방법에 대한 아이디어가 있습니까?

답변:


22

기본적으로 MySQL은 문자열의 경우를 고려하지 않습니다.

이것은 사실이 아닙니다. 때마다 당신 create database의 MySQL의 데이터베이스 / 스키마는 문자 집합 및 데이터 정렬이 있습니다. 각 문자 집합에는 기본 데이터 정렬이 있습니다. 자세한 내용 은 여기 를 참조하십시오.

문자 집합에 대한 기본 데이터 정렬 latin1이며, latin1_swedish_ci대소 문자를 구분하지 될 일이.

예를 들어 latin1_general_cs( MySQL grammar ) 대소 문자 구분 데이터 정렬을 선택할 수 있습니다 .

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

이것은 그룹화와 평등과 같은 것들에 영향을 미칩니다. 예를 들어

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

대소 문자를 구분하는 데이터베이스에서 다음을 얻습니다.

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| ABC   |        1 |
| aBc   |        1 |
| abC   |        1 |
| abc   |        1 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
+----+-------+

대소 문자를 구분하지 않는 데이터베이스에서는 다음과 같은 이점이 있습니다.

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| abc   |        4 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

쿼리 내 에서 데이터 정렬 변경할 수도 있습니다 . 예를 들어 대 / 소문자를 구분하는 데이터베이스에서

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

13

MySQL은 꾸준히 개발 중이므로 항상 어떤 버전의 MySQL을 사용 중인지 질문해야합니다.

좋아, 다시 질문에 :

당신이 기능의 사용 수 있도록 MySQL의에서 문자열 함수는 항상 대소 문자를 구분 LOCATE, POSITION또는를 INSTR.

예를 들면 다음과 같습니다.

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

정규 표현식 ( RLIKE또는 REGEXP) 과 일치하는 패턴 은 최신 3.23.4를 제외한 모든 버전의 MySQL에서 항상 대소 문자를 구분합니다.

예를 들면 다음과 같습니다.

SELECT phone FROM user WHERE user_name REGEXP 'term';

정규 비교 (=)와 SQL 패턴 일치 ( LIKE) 모두에 대해 관련 필드에 따라 동작이 달라집니다.

에이. CHAR, VARCHAR및 모든 TEXT 필드 변형은 대소 문자를 구분하지 않습니다.

비. CHAR BINARY, VARCHAR BINARY 및 BLOB 필드의 모든 변종은 대소 문자를 비교 않습니다.

(a)의 필드와 (b)의 필드를 비교하면 비교는 대소 문자를 구분합니다 (대소 문자 구분). MySQL 참조 매뉴얼의 "7.2.7 문자열 유형"장을 참조하여 정렬 및 비교에 대한 설명을 찾으십시오.

V3.23.0부터는 BINARY관련 필드의 유형에 관계없이 캐스트 연산자를 사용하여 대소 문자 구분을 강제로 비교할 수도 있습니다. MySQL Reference Manual의 "7.3.7 캐스트 연산자"장을 참조하십시오.

따라서 user_name 유형을 변경하거나 V3.23.x를 사용하여 다음과 같이 시도하십시오.

SELECT phone FROM user WHERE BINARY username LIKE '%term%';

1

상황 에서는 Access 2010을 사용하고 있지만 같은 문제가 있지만 해결책이 다릅니다. StrComp()함수를 사용 하고 반환 값을 0으로 테스트 하십시오 .

StrComp( thing, 'abc', 0) = 0

때문에 StrComp()반환 -1첫 번째 인수가 "작은"의 경우 1는 "더 큰"이며, 경우 0는 "동일"인 경우, 때 StrComp()=0, 당신은 대소 문자를 구분하는 경기가있다.

여기 , 여기 또는 여기를 참조 하십시오 .


0

이것은 문자 세트에 관계없이 MySQL에서 작동합니다. 결과로 'test'REGEXP BINARY 'TEST'를 선택하십시오. 'BINARY'를 넣으면 이진 비교가 수행됩니다.


-2

무의미한 검색을 위해 이것을 시도하십시오, 그것은 훌륭한 성능으로 잘 작동합니다 :

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.