MySQL 대소 문자 구분 선택


242

MySQL SELECT쿼리가 대소 문자를 구분하는지 아니면 대소 문자를 구분하지 않는지 누구나 말해 줄 수 있습니까 ? 그렇지 않은 경우 다음과 같은 작업을 수행하기 위해 어떤 쿼리를 보내야합니까?

SELECT * FROM `table` WHERE `Value` = "iaresavage"

실제로 실제 값은 Value입니다 IAreSavage.


44
궁극적으로는 신청 조합에 따라 달라집니다 - 그것은 (대소 문자 구분) 또는 '_cs'(대소 문자 구분) '_ci'의 경우
조반 Perovic

15
이것은 잘못 표현 된 질문입니다;). 답의 절반은 대소 문자를 구분하지 않는 비교를 수행하는 방법을 보여주고 절반은 대소 문자를 구분합니다. 그리고 1은 기본값이 대소 문자를 구분하지 않는다는 것을 나타냅니다. :) 다음과 같은 비교를해도 대소 문자를 구분하지 않아도됩니다.'value' in ('val1', 'val2', 'val3')
SaltyNuts

5
@SaltyNuts 사람, 7 년 후이 질문을 읽고 내가 얼마나 많은 멍청한 놈인지 깨달았습니다! 방금 문서를 읽을 수 있었고 그 대답은 SELECT 문에 대한 첫 문장과 같습니다.
NoodleOfDeath

@JovanPerovic의 말에 덧붙여서 utf8_bin은 대소 문자를 구분합니다. 그
당시에

답변:


494

그들은있는 경우를 구분 하면 않는 한, 이진 비교를 .


3
나는 주로 Tim의 의견에 동의합니다. 어디에서나 값을 "lower ()"하는 것이 처리하는 가장 좋은 방법이라고 생각하지 않습니다. 해결 방법처럼 보입니다. 그러나 나는 그것이 의미가 있고 더 쉬운 때에 그것을 인정합니다. (콜린은 collate가 더 좋다고 언급했습니다.) 우리는 역사적 데이터를 mysql 테이블로 옮겼습니다.이 테이블은 대소 문자를 구분하지 않는 특정 열 값 때문에 레거시 논리를 깨뜨 렸습니다. "GE1234"와 "ge1234"의 차이점을 알아야했습니다. 고유해야하고 그런 식으로 로그를 유지해야했습니다. 대신 create table 문에서 열을 다음과 같이 설정했습니다. varchar (20) CHARACTER SET utf8 COLLATE utf8_bin
gregthegeek

19
왜 그렇게 많은 사람들이 이것을 투표했는지 모르겠습니다. 그것은 분명히 여기 상태 dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html 것을 ... "알파벳 문자, 비교는 대소 문자를 구분 될 것이라고이 방법을." 따라서 'DickSavagewood'를 찾으면 'dicksavagewood'를 선택하지 않습니다. LOWER ()와 동일한 작업을 수행합니다. 따라서 질문에 대한 나의 대답 : 특정 경우에는 SELECT가 실제로 대소 문자를 구분합니다.
Luftwaffle

10
@ user1961753 : 다시 읽기 : "이진 문자열 (varbinary, blob)의 경우 ...는 대소 문자를 구분합니다."
Marc B

1
@MarcB이 링크는 이제 끊어졌습니다. 고칠 수 있습니까? :)
Phiter

5
Jovan이 말했듯이 데이터 정렬에 의존 하므로이 대답은 거의 잘못되었습니다.
phil294

117

값과 전달 된 매개 변수를 소문자로 지정할 수 있습니다.

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")

또 다른 (더 나은) 방법은 문서에서COLLATE 말한 것처럼 연산자 를 사용하는 것입니다


21
SELECT문장은 COLLATE그때 어떻게 사용 됩니까?
예 Barry

11
위의 참조 문서 페이지에서 "비 이진 문자열 비교는 기본적으로 대소 문자를 구분하지 않습니다"라고 말합니다.
퀘스트 당 Aronsson

9
이 답변을 찬성 한 사람들의 수는 무섭습니다. @Marc가 위에서 설명한 것처럼 비교 대소 문자를 구분하지 않습니다. 데이터 정렬과 인덱스를 이해하고 적절하게 구성해야합니다. LOWER()또는 임의의 COLLATE절 과 같은 문자열 변환을 사용 하면 인덱스를 완전히 무시할 수 있으며 시간이 지남에 따라 테이블이 커짐에 따라 성능에 심각한 영향을 줄 수 있습니다. 아마 당신이 찾고있는 사용자 이름입니까? 대소 문자를 구분하지 않는 데이터 정렬을 사용하고 열에 고유 인덱스를 추가하십시오. 사용 EXPLAIN인덱스가 사용되고 있음을 확인합니다.
mindplay.dk

1
mindplay.dk와 동일하게 말하려고했습니다 ... upper () 및 lower ()는 인덱스를 무시하고 큰 데이터베이스 테이블의 성능에 직접 영향을 미칩니다.
GTodorov

mindplay.dk와 GTodorov의 의견에 모두 동의합니다. where 절의 대상 열에서 일부 방법을 사용하는 데주의하십시오. 열의 색인은 쓸모가 없습니다. 설명을 사용하십시오!
traeper

51

이진 사용

이것은 간단한 선택입니다

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

이진으로 선택입니다

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

또는

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0


3
= (SELECT * FROM myTable WHERE BINARY 'something'= 'Something')의 한쪽에만 BINARY를 사용하는 것이 언제 합리적입니까?
Jimmy

@Jimmy 정확히 무엇을 의미합니까? 코드가 작동합니다. 비교에서 한쪽이 이진으로 변환되면 비교는 이진으로 수행됩니다.
Jori

@ Jori 오, 내가 잘못 읽은 것 같아요. 두 예제 중 하나가 양쪽에 BINARY가 있다고 생각했습니다.
Jimmy

나는 이것이 실제로 정답이기 때문에 나는 이것을 투표했다. MySQL 웹 사이트의 문서에 따르면 BINARY 명령은 모든 것을 그대로두고 그대로 사용하기 때문에 단어를 요청하거나 특정 언어로 요청하는 것보다 BINARY 명령을 사용하는 것이 낫다고 말합니다. 제시됩니다. 그래서 내가 답을 찾고 나왔을 때-여기에있는 두 가지 대답은 나를 MySQL 웹 사이트로 안내하고 그들의 문서를 보았습니다. BINARY를 사용하는 것이 좋습니다. 번역하면 다른 문제가 발생할 수 있습니다.
Mark Manning

43

비교는 다음 의 경우를 구분 열이 끝나는 정렬을 사용하는 경우 _ci(예로서 기본 latin1_general_ci 정렬)하고는 대소 문자 열이 콜레 단부 사용할 때 _cs또는 _bin(예로서 utf8_unicode_csutf8_bin데이터 정렬).

데이터 정렬 확인

다음을 사용하여 서버 , 데이터베이스연결 데이터 정렬을 확인할 수 있습니다 .

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

다음을 사용 하여 테이블 데이터 정렬을 확인할 수 있습니다 .

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

데이터 정렬 변경

데이터베이스, 테이블 또는 열 데이터 정렬을 다음과 같이 대소 문자를 구분하는 것으로 변경할 수 있습니다.

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- or change column collation
ALTER TABLE `table` CHANGE `Value` 
    `Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

비교는 대소 문자를 구분해야합니다.


25

WHERE 문구의 문자열 비교는 대소 문자를 구분하지 않습니다. 당신은을 사용하여 비교하려고 할 수 있습니다

WHERE `colname` = 'keyword'

또는

WHERE `colname` = 'KeyWord'

그리고 당신은 같은 결과 를 얻을 것이다 . 이것이 MySQL의 기본 동작입니다.

비교를 대소 문자를 구분 하려면 다음 COLLATE과 같이 추가 하십시오.

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

그 SQL은 다음과 같이 다른 결과를 줄 것입니다 : WHERE colnameCOLLATE latin1_general_cs = 'keyword'

latin1_general_cs 대부분의 데이터베이스에서 공통 또는 기본 데이터 정렬입니다.


16

선택한 데이터 정렬은 대소 문자를 구분할지 여부를 설정합니다.


9

기본값은 대소 문자를 구분하지 않지만 다음으로 가장 중요하게 고려해야 할 것은 테이블을 만들 때 대 / 소문자를 지정할 수 있기 때문에 처음에 테이블을 만든 방법입니다.

아래 스크립트는 테이블을 만듭니다. 하단에 "COLLATE latin1_general_cs"라고 적혀 있습니다. 끝에있는 cs는 대소 문자를 구분합니다. 테이블을 대소 문자를 구분하지 않으려면 해당 부분을 생략하거나 "COLLATE latin1_general_ci"를 사용하십시오.

   CREATE Table PEOPLE (

       USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

       FIRST_NAME  VARCHAR(50) NOT NULL,
       LAST_NAME  VARCHAR(50) NOT NULL,

       PRIMARY KEY (USER_ID)

   )

   ENGINE=MyISAM DEFAULT CHARACTER SET latin1
    COLLATE latin1_general_cs AUTO_INCREMENT=0;

자신의 테이블을 만들 수있는 프로젝트 인 경우 테이블을 만들 때 대 / 소문자 구분 환경 설정을 지정하는 것이 좋습니다.




2

또한 lower_case_table_nameconfig 지시문을 1로 설정하지 않으면 Linux에서 테이블 이름은 대소 문자를 구분합니다 . Linux에서 대소 문자를 구분하는 파일로 테이블이 표시되기 때문입니다.

특히 대소 문자를 구분하지 않고 프로덕션 환경에 배포하는 Windows 개발에주의하십시오. 예를 들면 다음과 같습니다.

"SELECT * from mytable" 

위에서 언급 한 지시문이 설정되어 있지 않으면 myTable에 대해 myTable은 Windows에서는 성공하지만 Linux에서는 다시 실패합니다.

여기를 참조하십시오 : http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html


1
+1-대소 문자를 구분하지 않는 쿼리를 작성하고 Linux에서 실패하는 시나리오가 프로젝트에서 많이 일어났습니다
Vic

@Vic 프로젝트와 동일한 문제가 있습니다. 어떻게 고치셨습니까?
Kamran Ahmed

@ KamranAhmed, 당신은 생성 스크립트에 나타나는 테이블 이름의 케이싱을 사용해야합니다
Vic

문자 그대로 많은 쿼리를 수정해야하기 때문에 @Vic이 최후의 수단이되었습니다. 쉬운 방법이 있는지 궁금합니다. 그래도 고마워!
Kamran Ahmed

@KamranAhmed, lower_case_table_name우리가 아래에 언급 한 답변에 지정된대로 변경하십시오
Vic

1

현재 허용되는 솔루션은 대부분 정확합니다.

이진이 아닌 문자열 (CHAR, VARCHAR, TEXT)을 사용하는 경우 기본 데이터 정렬에 따라 대소 문자를 구분하지 않고 비교 합니다.

이진 문자열 (BINARY, VARBINARY, BLOB)을 사용하는 경우 비교는 대소 문자를 구분하므로 LOWER다른 답변에 설명 된대로 사용해야 합니다.

기본 데이터 정렬을 사용하지 않고 이진이 아닌 문자열을 사용하는 경우 대소 문자 구분은 선택한 데이터 정렬에 의해 결정됩니다.

출처 : https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html . 자세히 읽으십시오. 어떤 사람들은 비교가 대소 문자를 구분하거나 대소 문자를 구분하지 않는다고 잘못 생각했습니다. 그렇지 않다.


0

시도해 볼 수 있습니다. 도움이 되길 바랍니다.

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "IAreSavage"

0

이진 플래그가 설정된 문자열 필드는 항상 대소 문자를 구분합니다. 이진이 아닌 텍스트 필드를 대 / 소문자를 구분하여 검색해야하는 경우 다음을 사용하십시오. SELECT 'test'REGEXP BINARY 'TEST'AS RESULT;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.