2014-10-15 14 views
1

NLS 문자 인코딩이 다른 몇 개의 데이터베이스가 있습니다. 하나는 AL32UTF8 (UTF-8)을 사용하고 다른 하나는 WE8MSWIN1252 (Windows 1252)을 사용합니다. 예, 이것은 나쁘다. 그리고 나는 똑같은 것들을 똑바로 나오도록 밀어 붙일 것이다. 그 동안 비 ASCII 문자가 포함 된 SQL을 작성해야합니다. 예를 들어 유니 코드에서 U+00E1 인 á을 사용해야합니다. UTF-8에서는 16 진수 값 0xC3A1으로 표시되며 Windows 1252에서는 16 진수 값 0x00E1으로 표시됩니다.단일 문자 코드에서 비 ASCII 문자 얻기

이 그래서 내가 UTF-8 데이터베이스에서 원하는 걸 수 있습니다. (즉, 그 바이트 값입니다) :

SELECT CHR(TO_NUMBER('C3A1', 'xxxx')) FROM DUAL; 

을 그리고 이것은 내가 윈도우 1252 데이터베이스에서 원하는 걸 제공합니다 :

SELECT CHR(TO_NUMBER('00E1', 'xxxx')) FROM DUAL; 

오라클이 올바른 인코딩으로 변환하고 변환 할 수있는 방법을 찾지 못하는 것 같습니다. 나는 내가 어떤 표현을 사용하는지 신경 쓰지 않는다. 두 스크립트 모두에서 동일한 스크립트를 실행해야하므로 한 개의 16 진수 값만 사용하려고합니다. 어떻게해야합니까?

Oracle 11g를 사용하십시오. (불행하게도, 하나는 11.1이고 다른 하나는 현재 11.2입니다.)

답변

5

두 기능 당신은 UNISTRTO_CHAR을 도울 수 있습니다 :

:

  1. 데이터베이스의 국가 문자 세트로 돌아가려면

    SELECT UNISTR('\00E1') FROM DUAL; 
    
  2. 데이터베이스 문자 집합에 반환하려면 다음과

    SELECT TO_CHAR(UNISTR('\00E1')) FROM DUAL; 
    
  3. ,536

:

UNISTR는 인수로 텍스트 문자 또는 문자 데이터로 확인하고 국가 문자 집합을 반환하는 식을합니다. 데이터베이스의 국가 별 문자 집합은 AL16UTF16 또는 UTF8이 될 수 있습니다. UNISTR은 문자열의 유니 코드 인코딩 값을 지정하여 유니 코드 문자열 리터럴을 지원합니다. 예를 들어 NCHAR 열에 데이터를 삽입하는 데 유용합니다.

유니 코드 인코딩 값의 형식은 '\ xxxx'이며 'xxxx'는 UCS-2 인코딩 형식의 문자의 16 진수 값입니다. 보조 문자는 상위 대리 변수 범위 (U + D800에서 U + DBFF까지)와 하위 사로 게이트 범위 (U + DC00 - U + DFFF)의 두 번째 코드 단위로 인코딩됩니다. 문자열 자체에 백 슬래시를 포함하려면 앞에 백 슬래시 (\)를 추가하십시오.

이식성과 데이터 보존을 위해 UNISTR 문자열 인수에 ASCII 문자와 유니 코드 인코딩 값만 지정하는 것이 좋습니다.

TO_CHAR(character)From TO_CHAR(character) documenation:

는 데이터베이스 문자 집합에 NCHAR, NVARCHAR2, CLOB 또는 NCLOB 데이터를 변환합니다. 리턴되는 값은 항상 VARCHAR2입니다.

+0

오, 이런. 이것은 나올 해킹 된 쓰레기보다 훨씬 낫습니다. 고맙습니다! 필자의 이해를 확인하기 위해 이스케이프 된 유니 코드 코드 포인트를 포함 할 수있는 ASCII 문자열을 전달하여 UNISTR을 사용합니다. 그런 다음 국가 인코딩으로 문자열을 출력합니다. 그 맞습니까? – jpmc26

+1

예 (예 :'UNISTR ('abc \ 00E1xyz')' – Rimas