source

오라클 데이터베이스 테이블의 경우 열에 대한 문자 집합

nicesource 2023. 7. 28. 22:11
반응형

오라클 데이터베이스 테이블의 경우 열에 대한 문자 집합

SQL*Plus에서 다음 쿼리를 실행하고 있습니다.

CREATE TABLE  tbl_audit_trail (
  id NUMBER(11) NOT NULL,
  old_value varchar2(255) NOT NULL,
  new_value varchar2(255) NOT NULL,
  action varchar2(20) CHARACTER SET latin1 NOT NULL,
  model varchar2(255) CHARACTER SET latin1 NOT NULL,
  field varchar2(64) CHARACTER SET latin1 NOT NULL,
  stamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  user_id NUMBER(11) NOT NULL,
  model_id varchar2(65) CHARACTER SET latin1 NOT NULL,
  PRIMARY KEY (id),  
  KEY idx_action (action)
);

다음 오류가 발생합니다.

action varchar2(20) CHARACTER SET latin1 NOT NULL,
                      *
ERROR at line 5:
ORA-00907: missing right parenthesis

제가 뭘 놓쳤는지 말씀해 주시겠어요?

간단한 대답은 MySQL과 달리 문자 집합을 열(또는 테이블) 수준에서 정의할 수 없다는 것입니다.Latin1올바른 Oracle 문자 집합도 아닙니다.

문자 집합은 데이터베이스 전체에서 일치하며, 데이터베이스를 작성할 때 지정됩니다.당신은 당신의 캐릭터를 조회함으로써 찾을 수 있습니다.

select value
  from nls_database_parameters
 where parameter = 'NLS_CHARACTERSET'

가능한 문자 집합의 전체 목록은 11gr2 9i에 사용할 수 있으며 쿼리할 수도 있습니다.

을 사용하여 다음을 설정할 수 있습니다.NLS_LANGUAGE또는NLS_TERRITORY하지만 안타깝게도 캐릭터 세트에 대해서는 이렇게 할 수 없습니다.언어를 변경하면 Oracle이 저장된 데이터를 표시하는 방식이 변경되는 반면 문자 집합을 변경하면 Oracle이 데이터를 저장하는 방식이 변경되기 때문이라고 생각합니다.

데이터를 표시할 때 사용 중인 클라이언트에서 필요한 문자 집합을 지정할 수 있습니다.

문자 집합 마이그레이션은 사소한 작업이 아니므로 가볍게 수행해서는 안 됩니다.

그런데 왜 라틴어 1을 사용하려고 하나요? 1을 사용하려고 합니까?UTF-8과 같은 곳에 새로운 데이터베이스를 설정하는 것이 더 일반적일 것입니다.AL32UTF8사용하지 않음UTF8) 또는 UTF-16을 사용하여 멀티바이트 데이터를 효과적으로 저장할 수 있습니다.지금은 필요하지 않더라도 미래에 마이그레이션할 필요 없이 데이터베이스를 미래에 입증하는 것이 현명합니다.

데이터베이스의 여러 열에 대해 서로 다른 문자 집합을 지정하려는 경우 이 요구사항이 실제로 필요한지 여부를 확인하고 제거하는 것이 좋습니다.반드시1 필요한 경우 모든 잠재적인 문자 집합의 상위 집합인 문자 집합을 사용하는 것이 가장 좋습니다.그런 다음 열을 특정 16진수 값으로 제한하는 검사 제약 조건을 사용합니다.저는 이것을 하는 것을 전혀 추천하지 않습니다. 실수가 슬금슬금 일어날 가능성이 크고 매우 복잡합니다.또한 문자 집합에 따라 16진수 값이 다르게 렌더링됩니다.이는 열이 데이터베이스의 범위 밖에 있으므로 불가능한 특정 문자로 렌더링되도록 강제해야 함을 의미합니다.

상황을 알고 싶습니다

제공된 DDL 문에 따르면 일부는 2개의 문자 집합을 사용해야 합니다.Oracle에서 이 기능을 구현하는 것은 MySQL과 다르며 nvarchar2, nchar...와 같은 n*개의 데이터 유형으로 수행됩니다.Latin1은 기본값일 수 있는 일부 서유럽 문자 집합과 유사합니다.예를 들어 "Latin1"(WE**)과 일부 유니코드(UTF8...)를 정의할 수 있습니다.

NVARCHAR2 데이터 유형은 데이터베이스의 나머지 부분(VARCHAR2 사용)에 대해 다른 문자 집합을 유지하면서 일부 열에 대해 유니코드를 사용하려는 데이터베이스를 위해 Oracle에 의해 도입되었습니다.NVARCHAR2는 유니코드 전용 데이터 유형입니다.NVARCHAR2를 사용하려는 이유는 DB가 유니코드가 아닌 문자를 사용하지만 일부 열에 대한 유니코드 데이터를 저장할 수 있기를 원하기 때문일 수 있습니다.예제의 열은 동일한 데이터를 저장할 수 있지만 바이트 저장소는 다릅니다.

언급URL : https://stackoverflow.com/questions/9956433/defining-a-character-set-for-a-column-for-oracle-database-tables

반응형