오라클 대소문자 구분 없애는 법! 1 12 6,847

by 농sql [Oracle 기초] 오라클 대소문자구분 [2019.05.27 15:46:02]


기본적으로 오라클에서 대소문자를 구분하고 있는데

대소문자 구분없이 데이터를 사용하고 싶습니다.

UPPER LOWER 같은거 말고 설정으로 하는법이 있나요?

테이블별이나 계정별로도 대소문자 구분하는 옵션이 존재하나요?

있다면 알려주셨으면 합니다..

by 랑에1 [2019.05.27 16:09:27]

NLS_SORT 파라미터 default값이 'BINARY'로 되어있는데

alter session set NLS_SORT=BINARY_CI; 로 바꾸면 세션단위로 대소문자 구분없는 환경으로 사용할 수 있다고 하네요.

물론 해보진 않았습니다 ㅎㅎ

 

 


by 랑에1 [2019.05.27 16:43:34]

NLS_SORT만 변경하면 안되고

마농님이 적어주신대로 NLS_COMP=LINGUISTIC or NLS_COMP=ANSI 도 하니까 잘 됩니다!


by 마농 [2019.05.27 16:37:28]
-- 1. 정렬 및 비교 관련 파라미터 확인 --
SELECT * FROM nls_session_parameters WHERE parameter IN ('NLS_COMP', 'NLS_SORT');
-- Result --
PARAMETER | VALUE  
-------------------
NLS_SORT  | BINARY 
NLS_COMP  | BINARY 

-- 2. 대소문자 비교 테스트
SELECT * FROM dual WHERE 'a' = 'A';  ==> 0 Row

-- 3. 세션 파라미터 변경
ALTER SESSION SET NLS_SORT=BINARY_CI;
ALTER SESSION SET NLS_COMP=LINGUISTIC;

-- 4. 대소문자 비교 테스트
SELECT * FROM dual WHERE 'a' = 'A';  ==> 1 Row

 


by 마농 [2019.05.27 16:51:29]

비교는 잘 되는데.
인덱스를 못타네요.


by 랑에1 [2019.05.27 17:10:41]

마농님

실행계획이 좀 이상하게 늦게 나오는 느낌은 있는데..

저같은 경우는 인덱스 타긴 타는 것 같은데요? (제가 뭘 잘 못했으려나요;)


by 마농 [2019.05.27 17:31:54]
-- 0. 인덱스 생성, (Oracle XE 11.2.0.2.0)
CREATE INDEX emp1_ename ON emp1(ename);

-- 1. 대소문자 구별 안하도록 설정 --> 인덱스 안탐
ALTER SESSION SET NLS_SORT=BINARY_CI;
ALTER SESSION SET NLS_COMP=LINGUISTIC;
SELECT ename FROM emp1 WHERE ename = 'SCOTT';  --> Table Full Scan
SELECT ename FROM emp1 WHERE ename > 'SCOTT';  --> Table Full Scan
SELECT /*+ INDEX(emp1 emp1_ename) */ ename FROM emp1 WHERE ename = 'SCOTT';  --> Table Full Scan
-- Filter Predicates : NLSSORT(ENAME,'nls_sort=''BINARY_CI''')=HEXTORAW('73636F747400')

-- 2. 대소문자 구별하도록 설정 복원 --> 인덱스 탐
ALTER SESSION SET NLS_SORT=BINARY;
ALTER SESSION SET NLS_COMP=BINARY;
SELECT ename FROM emp1 WHERE ename = 'SCOTT';  --> Index Range Scan
SELECT ename FROM emp1 WHERE ename > 'SCOTT';  --> Index Range Scan

 


by 랑에1 [2019.05.27 17:55:31]

-- 다시 확인해봐도 전부 소문자일 경우는 인덱스를 타는 것 같습니다.

SELECT ename FROM emp1 WHERE ename = 'scott';  --> Index Range Scan

-- 하나라도 대문자가 끼어있으면 풀스캔 하는 것 같은데.. 제가 보는 환경에서만 이럴까요?

SELECT ename FROM emp1 WHERE ename = 'SCOTT';  --> Table Full Scan

SELECT ename FROM emp1 WHERE ename = 'Scott';  --> Table Full Scan

SELECT ename FROM emp1 WHERE ename = 'sCott';  --> Table Full Scan

SELECT ename FROM emp1 WHERE ename = 'scOtt';  --> Table Full Scan

by 마농 [2019.05.27 18:07:23]

소문자만 탄다면?
- 인덱스 안탄다고 결론 내려야 할 것 같네요.
- 저는 소문자도 안타네요.


by 삐르짱 [2019.05.28 09:59:39]

case insensitive 하게 인덱스를 생성하는 방법이 있나봅니다.

http://www.dba-oracle.com/t_case_insensitive_indexes_searches.htm


by 농sql [2019.05.28 10:12:55]

답변 주셔서 감사합니다.

데이터베이스 전체적으로 설정하는 방법이 있나요?
 


by 타락천사 [2019.05.29 09:33:37]

 Oracle 12c R2  부터 지원되는 옵션

칼럼 /  테이블 /  스키마 레벨 

https://stackoverflow.com/questions/8449227/is-there-a-way-in-oracle-to-make-a-column-not-case-sensitive


by 농sql [2019.05.30 10:18:26]

답변 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입