# varchar형의 칼럼에서 대문자소문자가 구별되지 않는다 (검색시의 케이스 비의존)
Category: "MySQL, 데이터베이스" , Tags: binary, MySQL, varchar, 대문자소문자, 케이스 비의존
사장입니다.
쉴새없이 갑니다.이번도 MySQL의 초초심자Tips. 이번의 이야기꺼리는, MySQL자신이 다큐먼트에서 그렇게 강조하고 있으므로 설정은 설정이지만 ,
Oracle기술자에게는 있을 수 없는 설정 인듯하고, 설마 그것이 옵션이라고 생각하지 않는 사람이 많아서.
그런거 이야기 해 봤자, 설정은 설정이죠? 어쩔수 없잖아요.
공식 다큐먼트를 빈틈없이 읽으면 알게 되지만, 모두 읽지 않지요?
그 기분 알아요. (그래도 읽은 편이 나아요)
그 2:varchar형의 칼럼에서 대문자와 소문자가 구별되지 않는다 (검색시의 케이스 비의존)
이것은 거의 매회 질문 받아요.
MySQL의 다큐먼트에서는 「검색시의 케이스 의존」 (Case Sensitivity in Searches)이라고 표현 하고 있음.
너무나 자주 올라오는 FAQ이므로 설마 모르지 않겠지 라고 생각해, 제 스스로 말하지는 않겠지만,
테스트에 들어갔을 때, 「where구로 지정한 문자열이 대문자와 소문자의 구별없이 매치하고 있는데,
설마 MySQL이 대문자와 소문자의 구별을 하지 않는 것은 아니겠지요?」이라고 하는 형태로,
마치 제가 만든 것인 것 같이 추궁당해요.
「binary속성을 붙여 주십시오」
char형도 같기 때문에.
이제부터 만든다면
Create Table 테이블 명 (칼럼 명 varchar(n) BINARY);
다시 만들 수 없다면
Alter Table 테이블 명 MODIFY 칼럼 명 varchar(n) BINARY;
이하는 Oracle 기술자에 적합한 예.
-col1을 binary 속성 첨부로, col2를 디폴트 첨부인 채로 테이블을 작성
mysql> Create Table tab1 (col1 varchar(10) BINARY, col2 varchar(10));
Query OK, 0 rows affected (0.19 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tab1 |
+----------------+
1 rows in set (0.00 sec)
모든 레코드를 취득
mysql> select * from tab1; +------+------+ | col1| col2| +------+------+ | aaa | BBB | +------+------+ 1 row in set ( 0.00 sec)
–col1(binary속성첨부)을 대문자와 소문자를 의식해서 조건검색
mysql> select * from tab1 where col1='AAA'; Empty set ( 0.00 sec)
– 0건 취득. Oracle 기술자는 이런 결과를 바라고 있음
– 다음에 col2(binary속성 없음)를 대문자와 소문자를 의식해서 조건 검색
mysql> select * from tab1 where col2='bbb'; +------+------+ | col1 | col2 | +------+------+ | aaa | BBB | +------+------+ 1 row in set (0.00 sec)
– 1건 취득
–그러나, 테이블에 들어있는 문자열과, 조건의 문자열은 대문자 소문자가 다름
– Oracle 기술자에 있어서 이 결과는 치명적으로 「MySQL은 쓸모 없잖아」라고 일컬어지는 것의 하나
– 어쩔수 없으므로 Alter Table에서 binary속성을 붙여 봄
mysql> Alter Table tab1 MODIFY col2 varchar(10) BINARY; Query OK, 1 row affected (0.48 sec) Records: 1 Duplicates: 0 Warnings: 0
아까의 것과 같은 조건으로 다시 검색
mysql> select * from tab1 where col1='bbb'; Empty set ( 0.00 sec)
– 이번의 결과 쪽이 좋았습니까? (일본의 술집에서 자주 쓰는 과거형으로 물어 봄…)
덧붙이자면, binary속성을 붙였을 때와 붙이지 않을 때의 Create Table문장이
MySQL에서 어떠한 SQL이 되어 있을 것인가, 부디 「show create table 테이블명」으로 확인해 볼 것을 권장합니다.
MySQL에서는 이것이 본래의 저희들에 적합한 SQL입니다 라고 표시될 것입니다.


