같습니다 테이블의 데이터가 손상되었습니다. 어떤 방법으로 거기에 도달했는지, 그리고 어떻게 할 수 있습니까?
부패 숫자 (또는 date) 값은 종종 OCI 프로그램에서 가져 오지만, imp
이 손상을 일으키는 것으로 알려진 버그 보고서가 있습니다. 내부 표현은 지원 정보 1007641.6에 문서화되어 있지만, 문제를 재현 할 때 this explanation을 사용하는 것이 더 쉽고 OCI 프로그램 대신 PL/SQL 블록을 사용할 수 있습니다.
두 숫자는이 같은 내부적으로 표현되어야 문제가 발생하는 : 당신이 테이블에있는 값을 정확히 파악하지 않은
select dump(0.000000000099, 16) as d1,
dump(0.000000001680, 16) as d2
from dual;
D1 D2
------------------ ---------------------
Typ=2 Len=2: bb,64 Typ=2 Len=3: bc,11,51
을,하지만 난 비슷한 결과를 표시 할 수 있습니다 :
column d1 format a25
column d2 format a25
select amount, dump(amount) d1, dump(amount, 16) d2
from t42;
AMOUNT D1 D2
--------------------------- ------------------------- -------------------------
0.00000000010 Typ=2 Len=2: 187,101 Typ=2 Len=2: bb,65
0.000000001499 Typ=2 Len=3: 188,16,0 Typ=2 Len=3: bc,10,0
실행 : 값을 덤프
create table t42 (amount number(32,12)) nologging;
declare
n number;
begin
dbms_stats.convert_raw_value('bb65', n);
insert into t42 (amount) values (n);
dbms_stats.convert_raw_value('bc100000', n);
insert into t42 (amount) values (n);
end;
/
은 이상한 약간의 모양을 보여줍니다 당신은 내가 당신이보고있는 정확하게 값을 다시 만들 수 있다면 내가 볼 수있는 질문에 자신의 데이터에 대한 dump()
출력을 추가 할 수 있습니다
select amount as actual__________amount,
TO_CHAR(amount,'FM99999999999999999999999999999990.099999999999')
as amount__________Changed
from t42
order by amount;
ACTUAL__________AMOUNT AMOUNT__________CHANGED
--------------------------- ----------------------------------------------
0.00000000010 ##############################################
0.000000001499 0.00000000150/
: 그에 대한 당신의 형식이 유사한 결과를 제공합니다.
update t42 set amount = amount * 1;
select amount, dump(amount) d1, dump(amount, 16) d2
from t42;
AMOUNT D1 D2
--------------------------- ------------------------- -------------------------
0.0000000001 Typ=2 Len=2: 188,2 Typ=2 Len=2: bc,2
0.000000001499 Typ=2 Len=3: 188,15,100 Typ=2 Len=3: bc,f,64
select amount as actual__________amount,
TO_CHAR(amount,'FM99999999999999999999999999999990.099999999999')
as amount__________Changed
from t42
order by amount;
ACTUAL__________AMOUNT AMOUNT__________CHANGED
--------------------------- ----------------------------------------------
0.0000000001 0.0000000001
0.000000001499 0.000000001499
는 그러나 실제 정확한 값은 아마 어떻게/왜 다시 오는, 무엇인지 물어 봐야 :
일화, 데이터, 예를 업데이트하여이 '올바른'을 할 수 있습니다/그것이 손상되었을 때. 이 데이터가 중요하다면 나는이 데이터를 만지는 것에 매우 조심 스러울 것이며, 은 오라클 지원이 그것을 소트하기 위해 관련된 DazzaL의 조언을 두 번째로 가져야 만한다.
실제로 추가 되었습니까? 아니면 GUI가 재생되고 있습니까? your_table'에서 ascii (substr (to_char (your_column, '<형식 모델>'), -1)을 선택할 수 있습니까? 숫자 인 경우 48-57 범위에 있어야합니다. – Ben
GUI 때문이 아닙니다. 값이/& #로보기에 저장됩니다. 위 쿼리의 출력 결과는 47입니다. 범위는 48-57입니까? – user1501147
0-9 [ASCII] (http://www.asciitable.com/)의 값이지만 대부분의 서양 문자 집합에 대해서는 상당히 일반적입니다. 47은'/'이므로 하나를 추가하면 ... – Ben