2017-12-21 5 views
1

많은 레코드가있는 Oracle Database가 있습니다. 최근에 우리는 데이터 유형이 nvarchar2 인 열에 페르시아/아라비아 숫자를 저장할 수없고 물음표 "?"를 나타내는 숫자 대신에 페르시아/아라비아 숫자를 저장할 수 없다는 것을 알았습니다.Oracle Database 내에 페르시아어/아랍어 숫자 및 숫자 저장

나는 이러한 명령을 사용하여 문자 집합을 확인하려면이 겪었 :

SELECT * 
from NLS_DATABASE_PARAMETERS 
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET'); 

이 명령을

SELECT USERENV('language') FROM DUAL; 

결과는이 두 가지 각각이다 : enter image description here

내가이 발행 명령 :

SELECT DUMP(myColumn, 1016) FROM myTable; 

는 그리고 그 결과는 다음과 같다 :

Typ=1 Len=22 CharacterSet=AL16UTF16: 6,33,6,44,6,27,6,45,0,20,0,3f,0,3f,0,2f,0,3f,0,2f,0,3f 

결과는 괜찮을 것 같다하지만 불행히도 우리는 아직도 그 컬럼 내의 페르시아어/아랍어 숫자를 저장할 수 없습니다. 그러나 페르시아어/아랍어 알파벳은 괜찮습니다. 이 문제의 원인을 아십니까?

당신은

+1

'덤프 선택 (..., 1016) FROM ...을 실행하면 무엇을 얻게됩니까?' –

+0

SQL Developer에서 (이 설정을 쿼리하는 위치 인 것처럼 보이는) 이것을 보게된다면, 도구 -> 환경 설정 -> 환경에서 어떤 인코딩을 사용하고 있는가? 너 어디서 봤니? –

+0

@AlexPoole UTF8입니다. – Mehdi

답변

1

USERENV('language')클라이언트 문자 집합 반환하지 않습니다 감사합니다.

그래서, SELECT USERENV('language') FROM DUAL;은 (기발한 해결 방법이있을 것처럼 보이지만 : How do I check the NLS_LANG of the client?) SQL 문에 의해 클라이언트NLS_LANG를 얻을 수

SELECT l.value||'_'||t.value||'.'||c.value 
FROM (SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_LANGUAGE') l 
    CROSS JOIN (SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_TERRITORY') t 
    CROSS JOIN (SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET') c; 

그것은 불가능 같다

확인하세요 클라이언트 NLS_LANG 설정입니다. 레지스트리 (HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG, HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG) 또는 환경 변수로 정의됩니다. 환경 변수가 우선합니다.

그런 다음 클라이언트 응용 프로그램 (사용하고있는 응용 프로그램을 알려주지 않았 음)이 NLS_LANG에 지정된 것과 동일한 문자 집합을 사용하는지 확인해야합니다. Database JDBC Developer's Guide - Globalization Support

도 참조 OdbcConnection returning Chinese Characters as "?"

+0

실제로 애플리케이션이 작성되었습니다. Java에서. 당신이 보낸 JDBC Globalization 링크를 확인하려고합니다. – Mehdi

0

이 자신에게 호의를 수행하고 AR8MSWIN1256에서 AL32UTF8에 데이터베이스의 기본 문자 세트로 변환 : 응용 프로그램이 자바에서 실행되는 경우

는 이것 봐. 이러한 문제의 대부분은 사라질 것입니다. NCHARNVARCHAR2을 잊어 버릴 수 있습니다. 그들은 더 이상 필요하지 않습니다.

1 회에 한 번만 노력하면 돈을 갚을 수 있습니다.

자세한 내용은 Character Set Migration을 참조하십시오.

+0

이렇게하면 내 데이터가 어떻게됩니까? – Mehdi

+0

AR8MSWIN1256으로 저장된 모든 데이터가 AL32UTF8로 올바르게 변환됩니다. AR8MSWIN1256의 수퍼 세트이기 때문에 변환은 무손실입니다. – Codo

+0

나는이 해결책을 시도 할 것이고 당신에게 알려줄 것이다 Thank You Codo – Mehdi