2017-09-23 8 views
0

나는 파일로부터 날짜를 얻었으므로 이것을 DB Oracle에 삽입하고있다.인서트 값 인 코드 오라클

  • 열 VARCHAR2 형태, 크기, 나는 예외를 'абв'을 삽입하는 시도하고보고 한

  • 3 바이트 : ORA-12899 : 너무 큰 값

    문제는 예입니다 열 (실제 : 6, 최대 : 3)

각 문자는 2 바이트로 인코딩되기 때문입니다. 이제 우리는 다시 인코딩 할 것입니다. 데이터베이스는 AL32UTF8로 인코딩됩니다. 파일의 인코딩은 CP866입니다.

시도

은 실패 코딩하기 :

Encoding srcEncodingFormat = Encoding.GetEncoding(866); 
Encoding dstEncodingFormat = Encoding.UTF8; 
byte[] originalByteString = srcEncodingFormat.GetBytes(s); 
byte[] convertedByteString = Encoding.Convert(srcEncodingFormat, 
dstEncodingFormat, originalByteString); 
s = dstEncodingFormat.GetString(convertedByteString); 

우리는 열 유형을 변경할 수 없습니다. VARCHAR2(3 CHAR)도 사용할 수 없습니다. 어떻게 해결할 수 있습니까? 데이터가 데이터베이스에 삽입 될 때 추가 할 값의 인코딩을 명시 적으로 지정할 수 있습니까?

NLS_LANGUAGE AMERICAN 
NLS_TERRITORY AMERICA 
NLS_CURRENCY $ 
NLS_ISO_CURRENCY AMERICA 
NLS_NUMERIC_CHARACTERS ., 
NLS_CHARACTERSET AL32UTF8 
NLS_CALENDAR GREGORIAN 
NLS_DATE_FORMAT DD-MON-RR 
NLS_DATE_LANGUAGE AMERICAN 
NLS_SORT BINARY 
NLS_TIME_FORMAT HH.MI.SSXFF AM 
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM 
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR 
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR 
NLS_DUAL_CURRENCY $ 
NLS_COMP BINARY 
NLS_LENGTH_SEMANTICS BYTE 
NLS_NCHAR_CONV_EXCP FALSE 
NLS_NCHAR_CHARACTERSET AL16UTF16 
NLS_RDBMS_VERSION 11.2.0.2.0 

이 내 NLS 매개 변수입니다. 사실 상사는 데이터베이스 수준에서 변경 될 내용을 엄격히 금지합니다. 실례합니다.이게 없으면 어떤 방법이 있겠습니까?

답변

1

불행히도 무엇을하고 싶지는 않습니다. 'абв'문자열에는 AL32UTF8 문자 집합에서 6 바이트가 필요합니다. 열에는 최대 3 바이트까지만 허용됩니다. 열에 특정 문자 집합을 정의 할 수 없습니다.

데이터베이스에 특정 인코딩으로 문자열을 제공 할 때마다 자동으로 해당 문자 집합의 올바른 표현으로 변환됩니다. 이 기능은 서로 다른 클라이언트를 다른 문자 집합으로 삽입 (및 쿼리) 할 수 있지만 항상 올바른 인코딩을 얻을 수 있도록하는 기능입니다.

이것은 일부 클라이언트에서 가능한 추한 속임수로 이어진다. (나는 C#에 대해 모른다) : 데이터베이스에 문자 집합을 전송할 때, 문자열은 데이터베이스와 동일한 문자 집합이다. NLS_CHARACTERSET. 변환이 필요 없기 때문에 종종 행에 삽입 된 문자열도 확인되지 않습니다. 문자열이 데이터베이스와 동일한 문자 집합을 사용하는 동일한 클라이언트에 의해서만 선택되는 한 모든 것이 잘된 것처럼 보입니다. 그러나 문자열이 데이터베이스 내부에서 사용될 때 (예 : 쿼리의 WHERE 부분의 어딘가에있을 수 있음) 예기치 않은 결과가 나타납니다. 다른 인코딩을 사용하는 클라이언트가이 데이터에 액세스하려고 시도하는 경우에도 마찬가지입니다. 이런 이유로 해킹을 구현하려면 이 아니고이 아닌 것이 좋습니다.

+0

.NET의 경우 응용 프로그램에서 사용하는 드라이버/공급자에 따라 다릅니다. 일부는 'NLS_LANG'(예 : ODP.NET 무인 드라이버)에서 설정을 상속 받고, 다른 일부는 현재 Windows 로케일 (예 : ODP.NET Managed Driver)에 의존하고 다른 설정은 항상 UTF-16을 사용합니다 (예 : Oracle의 OraOLEDB). –

+1

증언에서 그러한 해킹은 권장되지 않습니다. 또한 어쨌든 귀하의 경우에는 작동하지 않을 것입니다. 예를 들어, 'абв'을 CP866으로 바이트 단위로 전송하면 오라클이 자리 표시 자 (예 :'¿')로 즉시 바꿀 잘못된 UTF-8 문자 (유효하지 않은 바이트 값)가됩니다. 언급 된 해킹은 데이터베이스 문자 세트가 ** 모든 ** 바이트 값 (예 : 모든 ISO8859-x 인코딩 또는 Windows CPxxxx)을 처리하는 경우에만 작동합니다. –