2013-09-03 2 views
1

에서 빈 문자열로 연결하면 문자열의 마지막 문자가 손실됩니다. 원시 문자열이 있고이를 varchar2로 캐스팅 한 다음 원시로 다시 캐스트하면 원본 정보가 모두 남아 있습니다. 그러나, 그것을 varchar2로 캐스팅 한 다음 빈 문자열을 포함하여 그 위에 아무 것도 연결하지 않으면 마지막 문자가 손실됩니다.Oracle SQL Developer

SET SERVEROUTPUT ON; 
DECLARE 
    raw_string RAW(100); 
    v_string VARCHAR2(100); 
    raw_string2 RAW(100); 

BEGIN 
    raw_string := 'C5C6C7'; 
    v_string := utl_raw.cast_to_varchar2(raw_string); 

    dbms_output.put_line('Raw string:  ' || utl_raw.cast_to_raw(v_string)); 
    v_string := v_string || ''; 
    dbms_output.put_line('New raw string: ' || utl_raw.cast_to_raw(v_string)); 
END; 
/

라인 (11)과 13 사이의 유일한 차이점은 빈 문자열로 연결됩니다 v_string 후에 실행되는 라인 13 : 이 내가 그것을 복제하는 데 사용하고 코드입니다. 내가 아무것도을 연결하지 않는 경우

Raw string:  C5C6C7 
New raw string: C5C6 

새로운 원시 문자열이 같은 될 것입니다,하지만 난 심지어 그것의 앞에, 문자열에 아무것도를 추가하는 경우, 그것은 잃게됩니다 :하지만 출력이가 그 마지막 부분. 특정 문자에서만 발생합니다. '61'(소문자 'a')로 원시를 끝내면 아무 것도 손실되지 않습니다.

나는이 잠시 동안 지금 나를 혼란 된 v.3.2.20.09

오라클 SQL Developer를 사용하고 있는데 이것은 단지 버그의 경우 나는 뭔가를 놓치고 있는지 확실하지 않습니다 또는, 그러나 어떤 도움을 많이 주시면 감사하겠습니다.

+0

Toad - Oracle 11g에서 스크립트를 실행했지만 동일한 결과를 얻지 못했습니다. '원시 문자열 : C5C6C7 새로운 원시 문자열 : C5C6C7 PL/SQL 절차가 성공적으로 완료되었습니다 .' –

답변

5

RAWsVARCHARs으로 재생할 때 사용하고있는 문자 집합 (데이터베이스 문자 집합 및 클라이언트 cs)을 제공해야합니다.

이유는 모든 바이트 값이 원시 바이트에 유효하다는 것입니다. 0x00에서 0xFF까지입니다. 대부분의 문자 집합에는 잘못된 값이 있지만, 문자는없는 문자에 해당합니다.

오라클이 이러한 값을 만날 경우 그 결과는 예측할 수 없습니다. 이것은 여기서 일어날 일입니다.

예를 들어 UTF-8의 경우 byte whose binary representation starts with '110...' is the first byte of a two-byte character입니다.

그리고 정확히 상황의하십시오 C1100로 시작하고 단지 2 바이트 문자의 첫 번째 바이트가 될 수있는 바이너리 표현을 가지고 시작하는 바이트. 두 번째 바이트는 10.. (8에서 B)으로 시작해야합니다. 그래서 추측해야만한다면 UTF-8을 사용하고 있음을 예측할 수 있습니다. UTF-8은 불법적 인 바이트 값이 많은 것으로 잘 알려져 있습니다.

우리는 불법 UTF-8 값을 사용하는 것은 많은 문제에 이르게 것을 관찰 할 수있다 :

SQL> select utl_raw.cast_to_varchar2('C5C6') i0 from dual; 

I0 
-------------------------------------------------------------------------------- 
ÅÆ 

SQL> select utl_raw.cast_to_varchar2('C5C6')||'' i1 from dual; 

I1 
-------------------------------------------------------------------------------- 
Å 

SQL> select utl_raw.cast_to_varchar2('C5C6')||''||'' i2 from dual; 

I2 
-------------------------------------------------------------------------------- 

사실 모든 문자는 일반적으로 맹목적 VARCHAR2에 원료를 캐스팅 나쁜 생각 설정으로. 이 값이 올바른지 (예 : raw가 varchar2의 캐스트 인 경우)이라는 사실을 알 때 varchar2로만 캐스팅하려고합니다.

표시하거나 텍스트 전송 매체를 들면 VARCHAR2와 원시를 표현해야

, (예 UTL_ENCODE으로 base64위한) 하나 hextoraw 또는 부호화를 사용하는 것이 안전하다.

관련 문제