MySQL MariaDB에서 문자열 대소문자를 구분하지 않는다!

2021. 1. 21. 15:41IT개발/Database

반응형

현상 : 어라! MariaDB에서 쿼리를 날렸는데 정확하게 매칭되는것만 결과로 줘야하는데.... 누구냐넌! 왜왜~대소문자를 가리지 않고 오는겨?

 

원인 : MySQL MariaDB에서 문자열 대소문자를 구분하지 않는다.  mysql 공식문서 참고 : https://dev.mysql.com/doc/refman/5.6/en/case-sensitivity.html

 

해결 : 대소문자 구분하고 싶으면, BINARY 함수를 사용! 또는 테이블 생성시, BINARY옵션을 줘서 해결!

 

 

예시) EMPLYR_ID = 'test' 인 사용자가 하나 있다고 하자. 'TEST'로 검색시 안나와야하는데 나옴 ㅡ,.ㅡ

 

해결방법1

 

before   SELECT * FROM comtnemplyrinfo WHERE EMPLYR_ID = 'TEST'    ===> test 란 소문자로된 사용자 아이디가 검색이 됨;;;; 원치않는동작!!!
after  SELECT * FROM comtnemplyrinfo WHERE BINARY(EMPLYR_ID) = 'TEST'    ===> 검색결과 안나옴! 고로치! 그기야!

 

해결방법2 (강추)

ALTER TABLE comtnemplyrinfo CHANGE EMPLYR_ID EMPLYR_ID VARCHAR(100) BINARY NOT NULL

 

해결방법3

타입을 VARBINARY로 변경하는 방법.... 하지만 검색결과를 볼시, BLOB으로 표현되어 유지보수 측면에서 패스~

 

해결방법4

더있는데 생략한다.

 


 

보너스 트랙 (테이블명 대소문자 가릴까 말까?)

- 테이블 명을 소문자로만 취급할지 아니면 대문자로만 취급할지는 아래의 정보를 이용해 설정할것!

먼저 조회부터 해보자! ==> SHOW VARIABLES LIKE 'lower_case_table_names'

 

값의 의미는 아래 표를 보자

lower_case_table_names 값  의미  비고
 0  쿼리시, 테이블명 대·소문자 구분함 ==OS별 기본값==
리눅스, 유닉스 = 0
윈도우 = 1 
맥키토시 =  2 
 1  쿼리시, 테이블명이 대/소문자든 무조건 소문자로 인식
 2  윈도우에서 테이블 명을 대/소문자를 구분해서 생성

 

예시) 1일경우, 테이블명은 대문자로 주던 소문자로 주던 동작함.(참고로 저희 회사는 모든 프로젝트를 1로 설정해서 사용중)

SELECT * FROM COMTNEMPLYRINFO 

SELECT * FROM comtnemplyrinfo

 

그럼 우째 변경해야하나?

1. AWS의 RDS라면, RDS > 파라미터 그룹에 가서 lower_case_table_names 검색하면 설정가능하다!

2. 서버에 설치버전이면,  /etc/my.cnf 경로에 가서 원하는 값으로 편집하라!(당근 재기동해야겠쥬?)

반응형