목차
오라클 BYTE 설정 확인
공백 구분자로 텍스트 자르기
[ORACLE]
오라클 BYTE 설정 확인
ㅁ 현상
오라클의 데이터베이스에서는 NLS_LENGTH_SEMANTICS 파라미터 설정이 byte로 되어 있는 경우 한글 데이터 저장시 최대길이가 3배 늘어나게 되어 최대길이를 초과하게 되므로 char로 변경하여 테이블을 생성해야 올바르게 동작
(출처: 전자정부프레임워크 공통컴포넌트 설치 시 주의사항)
ㅁ 점검 방법
출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=darkturtle&logNo=50042229931
Table 생성 시 Column 정의를 아래와 같이 2가지로 부여할 수 있다.
BYTE VS CHAR
[ PL/SQL 프로그래밍 244 PAGE 참조 ]
SQL> conn / as sysdba
Connected.
col NAME format a30
col VALUE$ format a30
col COMMENT$ format a30
select * from sys.props$ where name = 'NLS_CHARACTERSET' ;
NAME VALUE$ COMMENT$
------------------------------ ------------------------------ ------------------------------
NLS_CHARACTERSET AL32UTF8 Character set
SQL> conn scott/tiger
Connected.
SQL> create table check_size1 ( a1 char(50 byte));
Table created.
SQL> create table check_size2 ( a1 char(50 char));
Table created.
SQL> select TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH
from user_tab_columns
where table_name in ('CHECK_SIZE1','CHECK_SIZE2');
TABLE_NAME COLUMN_NAME DATA_TYPE DATA_LENGTH
-------------------- -------------------- -------------------- -----------
CHECK_SIZE1 A1 CHAR 50
CHECK_SIZE2 A1 CHAR 200
==> UTF8 UNICODE 에서 50자의 문자를 지원하기 위해서 200BYTES 가 설정 된다.
즉, UTF8 에서 A1(50 CHAR) = A1(200 BYTE) 와 같다.
그럼 이제, BYTE나 CHAR 없이 생성 해보자 ..
SQL> create table check_size3 ( a1 char(50)) ;
Table created.
SQL> select TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH
2 from user_tab_columns
3 where table_name in ('CHECK_SIZE1','CHECK_SIZE2','CHECK_SIZE3');
TABLE_NAME COLUMN_NAME DATA_TYPE DATA_LENGTH
-------------------- -------------------- -------------------- -----------
CHECK_SIZE1 A1 CHAR 50
CHECK_SIZE2 A1 CHAR 200
CHECK_SIZE3 A1 CHAR 50
SQL> conn / as sysdba
Connected.
SQL> COL PARAMETER FORMAT A20
SQL> col VALUE format a20
SQL> select * from nls_session_parameters
2 where parameter ='NLS_LENGTH_SEMANTICS';
PARAMETER VALUE
-------------------- --------------------
NLS_LENGTH_SEMANTICS BYTE
==> CHAR / BYTE 없이 생성하면 NLS_LENGTH_SEMANTICS 값을 따른다.
!! CHAR / BYTE 로 지정이 가능하지면 결국 딕셔내리에 저장되는 것은 BYTE 로 저장된다 .
2012/01/12
CREATE TABLE CHECK_11 ( A1 VARCHAR2(3 BYTE), A2 VARCHAR2(3 char));
SQL> SELECT COLUMN_NAME, DATA_LENGTH, CHAR_USED FROM DBA_TAB_COLUMNS
WHERE TABLE_NAME ='CHECK_11';
COLUMN_NAME DATA_LENGTH C
------------------------------ ----------- -
A1 3 B
A2 9 C
2 rows selected.
#DBA_TAB_COLUMNS.CHAR_USED
VARCHAR2(1)
B | C.
B indicates that the column uses BYTE length semantics.
C indicates that the column uses CHAR length semantics.
NULL indicates the datatype is not any of the following: CHAR, VARCHAR2, NCHAR
# 2012/01/17
SQL> create table check_num ( a1 varchar2(10)) ;
Table created.
SQL> desc check_num
Name Null? Type
----------------------------------------------------------------------------------- -------- --------------------------------------------------------
A1 VARCHAR2(10)
SQL> select table_name, column_name, DATA_LENGTH, CHAR_LENGTH, CHAR_USED
2 from dba_tab_columns
3 where table_name ='CHECK_NUM';
TABLE_NAME COLUMN_NAME DATA_LENGTH CHAR_LENGTH CH
------------------------ ------------------------ ----------- ----------- --
CHECK_NUM A1 10 10 B
SQL> create table check_nonum ( a1 varchar2(10 char)) ;
Table created.
SQL> desc check_nonum
Name Null? Type
----------------------------------------------------------------------------------- -------- --------------------------------------------------------
A1 VARCHAR2(10 CHAR)
SQL> select table_name, column_name, DATA_LENGTH, CHAR_LENGTH, CHAR_USED
2 from dba_tab_columns
3 where table_name ='CHECK_NONUM';
TABLE_NAME COLUMN_NAME DATA_LENGTH CHAR_LENGTH CH
------------------------ ------------------------ ----------- ----------- --
CHECK_NONUM A1 30 10 C
!! 이런식으로 생성하자. 예) a1 varchar2(10)
이런식으로 생성하지 말자.. 머리 복잡해진다. 예 ) a1 varchar2(10 char)
공백 구분자로 텍스트 자르기
WITH a AS
(SELECT '제주특별자치도 서귀포시 광평로 105 ( 안덕면, 통나무힐스 )' bigo FROM DUAL
UNION ALL
SELECT '부산광역시 강서구 대저1동 4302-22' FROM DUAL)
SELECT bigo,
REGEXP_SUBSTR (bigo, '[^ ]+', 1, 1) a,
REGEXP_SUBSTR (bigo, '[^ ]+', 1, 2) b,
REGEXP_SUBSTR (bigo, '[^ ]+', 1, 3) c,
REGEXP_SUBSTR (bigo, '[^ ]+', 1, 4) d,
REGEXP_SUBSTR (bigo, '[^ ]+', 1, 5) e
FROM a
출처: https://calsifer.tistory.com/203
오라클 12C 계정 생성 방법
오라클12c부터 CDB, PDB 때문에 계정명 생성 시 c##을 붙여야 함
예) create user c##username identified by c##username
계정 생성 시 c## 제거법
sql> conn
사용자명 입력:system
sql> alter session set “_ORACLE_SCRIPT”=true;
세션이 변경되었습니다.
sql> create user username identified by username;
sql> grant connect, resource, dba to username;