답변:
기본적으로 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 |
+----+-------+
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%';
이것은 문자 세트에 관계없이 MySQL에서 작동합니다. 결과로 'test'REGEXP BINARY 'TEST'를 선택하십시오. 'BINARY'를 넣으면 이진 비교가 수행됩니다.