oracle character set 에 관하여 궁금한게 있습니다. 0 11 1,771

by 빵냠 [Oracle 기초] [2022.06.13 10:56:43]


안녕하세요. 

오라클 테이블 정보를 조회하다 궁금한게 생겨서 글 올립니다.

모든 테이블의 컬럼을 확인해보면 varchar2(255)로 길이가 설정되어 있는데,

SELECT b.table_name, b.column_name, b.data_type, b.data_length, b.data_precision, b.data_scale FROM user_tables a, user_tab_columns b WHERE a.table_name = b.table_name ORDER BY a.table_name, b.column_name;

위와 같은 쿼리문으로 테이블을 조회하니 varchar의 길이가 255와 510로 테이블마다 제각각 나오고 있습니다.

 

구글링을 하다보니 테이블마다 character set이 다르게 설정될 때도 있다고 해서 

SELECT * FROM nls_database_parameters WHERE PARAMETER LIKE '%CHARACTERSET%'; 

로 character set을 확인해보니 KO16MSWIN949과 AL16UTF16 두가지로 설정되어 있는것을 확인했습니다.

KO16MSWIN949는 한글이 2byte, AL16UTF16는 한글이 3byte여서 어떤건 data_length 가 255로 나오고 어떤건 510으로 나온걸까요 ?

 

1. 혹시 각 테이블마다 설정된 character set은 어떻게 확인할 수 있나요 ? 

2. varchar의 길이가 255와 510처럼 테이블마다 제각각으로 나오고 있다면 모든 테이블의 charcater set을 동일하게 변경해주면 바뀌는 문제일까요 ?

 

답변 부탁드립니다.

감사합니다.

 

 

 

 

 

by 마농 [2022.06.13 11:44:14]

일률적으로 255 인 것은 임의로 정한 그 사이트 만의 규칙인 듯 합니다. (개발 가이드)


by 빵냠 [2022.06.13 13:15:47]

안녕하세요.

일률적으로 255인 것은 처음에 테이블을 생성할 때 255 사이즈로 생성해서 그렇게 된 것 같다는 뜻일까요 ?


by 마농 [2022.06.13 13:19:24]

아마도...
그곳의 개발 가이드에 테이블 생성 규칙에 varchar2 는 255 로 정의해야 한다고 명시되어 있거나.
아니면 그곳 테이블들을 최초로 생성한 사람이 일률적으로 255로 생성을 했거나


by pajama [2022.06.13 12:22:01]

테이블마다 캐릭터셋을 다르게 할수 없는 걸로 알고 있고, 데이터베이스의 캐릭터셋이 사용됩니다.

NLS_CHARACTERSET 설정이 데이터베이스의 캐릭터셋입니다.

컬럼 길이 255, 510은 입력되는 데이터를 고려해서 그 길이로 정의한 듯 하네요.


by 빵냠 [2022.06.13 13:19:04]

안녕하세요.

그럼 NLS_CHARACTERSET에 설정된 KO16MSWIN949이 지금 사용중인 데이터베이스의 캐릭터 셋이군요 ! 

 

제가 궁금한 점은 분명 테이블에 들어가서 컬럼을 확인했을 때는 VARCHAR2(255)로 되어있는데

SELECT b.table_name, b.column_name, b.data_type, b.data_length, b.data_precision, b.data_scale FROM user_tables a, user_tab_columns b WHERE a.table_name = b.table_name ORDER BY a.table_name, b.column_name;

이 쿼리로 조회하게 되면 같은 컬럼이어도 data_length가 510로 나오는 것입니다.

혹시 왜 이렇게 나오는지 알 수 있을까요?

 


by 마농 [2022.06.13 13:28:11]

"테이블 들어가서 컬럼을 확인했을 때" 의 정확한 확인 과정이 안나와 있네요.
툴을 이용하신 것인가요? (토드, 오렌지, SQldeveloper 등)
VARCHAR2 선언할 때 옵션이 생겼습니다. (CAHR 로 할지 BYTE 로 할지)
VARCHAR2(255 CHAR) 로 생성한게 아닐지?
b.char_used 항목 추가로 조회해 보세요.


by 빵냠 [2022.06.13 13:59:42]

1.현재 툴은 DBeaver 사용중이며, 접속된 데이터베이스의 테이블을 클릭 시 저렇게 나오고 있습니다.

2. DDL을 보니 VARCHAR2(255 CHAR)로 선언되어 있는 것을 확인했는데 그렇다면 CHAR와 BYTE옵션 중 CHAR로 생성된것이 맞겠죠 ?

3. b.char_used 항목을 추가로 조회해 봤는데 B, C로 값이 다르게 나오는걸 확인했고, 길이가 255로 나오는 경우는 B, 510으로 나오는 경우는 C로 나옵니다 ! 혹시 일률적으로 최대 길이로 나오게 하려면 어떻게 변경해야 할까요 ?


by 마농 [2022.06.13 14:26:10]

"일률적으로 최대 길이로 나오게" 하려는 의도가 뭔가요? 그럴 필요가 없는데요.
일률적으로 255 로 선언 된 것도 불필요하게 크게 설정된 부분입니다.
컬럼별로 필요한 길이만큼만 설정하면 됩니다. 모든 컬럼을 일률적으로 통일시킬 이유가 없습니다.
참고로 최대 크기는 (2000 CHAR) (4000 BYTE) 입니다.


by 빵냠 [2022.06.13 17:02:11]

알려주신 대로 컬럼 길이 수정하였습니다! 

일괄적으로 255로 하긴했는데 불필요하게 크게 설정된 컬럼들이 눈에 보이네요 ^.^;

답변 해주신 덕분에 해결하였습니다 ! 

감사합니다 ^0^! 


by 마농 [2022.06.13 17:09:34]

음..컬럼 길이 수정하라고 알려드린 적은 없는데... 알려 주신대로 수정이라니...?
어떻게 수정한 걸까요? 불안합니다.
만들어 놓은 컬럼에 대한 질문이 아니라. 만들고자 하는 컬럼에 대한 질문이라면?
저는 일률적인 255 적용이 아닌 각 컬럼의 특성에 맞게 길이 줄이라고 조언하고 싶습니다.


by 신이만든지기 [2022.06.14 13:41:54]

개발환경이라서 바로 수정하신 모양이네요.

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