본문 바로가기
자료수집

데이터베이스 활용

by 3604 2022. 7. 1.
728x90

목차

오라클 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) 와 같다.

그럼 이제, BYTECHAR 없이 생성 해보자 ..   
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  AS

(SELECT '제주특별자치도 서귀포시 광평로 105 ( 안덕면, 통나무힐스 )' bigo  FROM DUAL

UNION ALL

SELECT '부산광역시 강서구 대저14302-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;

 

728x90

'자료수집' 카테고리의 다른 글

[데이터베이스] 인덱스란  (0) 2022.07.21
네트워크  (0) 2022.07.19
GBIC 형태  (0) 2022.06.28
포토샵  (0) 2022.06.28
양자시스템  (0) 2022.06.23