우리는 현재 중 하나를 마이그레이션 우리의 oracle 데이터베이스를 UTF8 고 우리가 발견되는 몇 가지 기록을 가까이 있는 4000 바이트 varchar 제한. 면 우리도 이러한 마이그레이션을 기록 그들은 실패로 그들의 문자를 포함하는 멀티바이트 UF8 문자입니다. 무엇을 원하는 내 PL/SQL 을 찾은 이러한 문자는 무엇을 보고 그들은 다음을 변경하거나 그들 또는 제거합니다.
내가 하고 싶은 것:
SELECT REGEXP_REPLACE(COLUMN,'[^[:ascii:]],'')
하지만 오라클를 구현하지 않[:ascii:]캐릭터 클래스입니다.
거기에 간단한 방법으로 일을 내가 무엇을 하시겠습니까?
나는 생각이 될 것이:
SELECT REGEXP_REPLACE(COLUMN, '[^[:print:]]', '')
선택처럼 보일 수 있습니다 다음 예제:
select nvalue from table
where length(asciistr(nvalue))!=length(nvalue)
order by nvalue;
이's 은 아마 더 직접적인 방법을 사용하여 정규표현식이 있습니다. 운으로,다른 누군가를 제공할 것입니다. 하지만 여기는's what I'd 할 필요 없이 이동한다.
을 만들 PLSQL 기능을받을 입력 문자열을 반환로 varchar2.
에 PLSQL 기능을 수행 asciistr()귀하의 입력이 있습니다. 이 PLSQL 기 때문입할 수 있는 문자열을 반환 4000 고 있는 32K 사용할 수 있로 varchar2 에 PLSQL.
는 기능을 변환하는 비-ASCII 문자\xxxx 로 표기. 그래서 정규 표현식을 사용할 수 있습을 찾고 제거하는 사람들. 그 결과입니다.
내가 찾은 해답이 여기:
http://www.squaredba.com/remove-non-ascii-characters-from-a-column-255.html
CREATE OR REPLACE FUNCTION O1DW.RECTIFY_NON_ASCII(INPUT_STR IN VARCHAR2)
RETURN VARCHAR2
IS
str VARCHAR2(2000);
act number :=0;
cnt number :=0;
askey number :=0;
OUTPUT_STR VARCHAR2(2000);
begin
str:=’^'||TO_CHAR(INPUT_STR)||’^';
cnt:=length(str);
for i in 1 .. cnt loop
askey :=0;
select ascii(substr(str,i,1)) into askey
from dual;
if askey < 32 or askey >=127 then
str :=’^'||REPLACE(str, CHR(askey),”);
end if;
end loop;
OUTPUT_STR := trim(ltrim(rtrim(trim(str),’^'),’^'));
RETURN (OUTPUT_STR);
end;
/
그런 다음 이를 데이터를 업데이트
update o1dw.rate_ipselect_p_20110505
set NCANI = RECTIFY_NON_ASCII(NCANI);
다음과 같이 하십시오.
-- To detect
select 1 from dual
where regexp_like(trim('xx test text æ¸¬è© ¦ “xmx” number²'),'['||chr(128)||'-'||chr(255)||']','in')
-- To strip out
select regexp_replace(trim('xx test text æ¸¬è© ¦ “xmxmx” number²'),'['||chr(128)||'-'||chr(255)||']','',1,0,'in')
from dual
나는 유사한 문제에 대한 블로그 그것은여기서. 을 시작 했을 정규 표현식을 위한 알파 numerics,다음에 추가 몇 가지 기본 문자가를 좋아했:
select dump(a,1016), a, b
from
(select regexp_replace(COLUMN,'[[:alnum:]/''%()> -.:=;[]','') a,
COLUMN b
from TABLE)
where a is not null
order by a;
나는 사용으로 덤프 1016 변형을 줄 진수 문자를 하고 싶었을 대체할 수 있는 다음에 사용자 utl_raw.cast_to_varchar2.
참고 사용할 때마다
regexp_like(column, '[A-Z]')
Oracle's regexp 엔진 일치합니다 특정 문자에서 라틴-1 의 범위뿐만 아니라:이 적용되는 모든 문자를 보면 비슷한 ASCII 문자 다음과 같Ä->AÖ->OÜ->U,etc., 그는[A-Z]은 당신이 알고 있는 무슨이에서 다른 환경,말처럼,Perl.
대와 조롱의 정규 표현식을 변경하십시오에 대한 NVARCHAR2 데이터 이전에는 캐릭터 설정된 업그레이드합니다.
다른 접근 방법의 절단 부분의 필드는'내용할 수 있도 사운 덱스 기능을 제공,당신의 데이터베이스는 유럽의 문자를(예:Latin-1)문자니다. 또는 당신은 단지 작성 기능을 변환하는 문서 라틴-1 의 범위로 유사하게 보이는 ASCII 문자처럼,
-å=>a -ä=>a -ö=>o
의 과정에 대한 텍스트를 블록을 초과하는 4000 바이트 변환 할 때 UTF-8 입니다.
응답에 의해 주어진 프란시스코 Hayoz 는 최고입니다. Don't use pl/sql 함수는 경우에는 sql 당신을 위해 그것을 할 수 있습니다.
여기에 간단한 테스트에서 오라클 11.2.03
select s
, regexp_replace(s,'[^'||chr(1)||'-'||chr(127)||']','') "rep ^1-127"
, dump(regexp_replace(s,'['||chr(127)||'-'||chr(225)||']','')) "rep 127-255"
from (
select listagg(c, '') within group (order by c) s
from (select 127+level l,chr(127+level) c from dual connect by level < 129))
와"담당자 127-255"
Typ=1Len=30:226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
i.e 에 대한 몇 가지 이유가 이전 버전의 오라클 대체하지 않습 char(226)습니다. 용'['||chr(127)||'-'||chr(225)||']' 원하는 결과를 제공합니다. 를 교체해야 하는 경우 다른 문자를 추가하기만 하면 regex 위거나 사용이 중첩된 대체|regexp_replace 경우에는 다른 다음''(문자열이 null).
나는'm 는 조금 늦게 이 질문에 대답하지만,같은 문제를 가지고 있었습니다 최근에(사람들은 잘라내어 붙여 넣는 모든 종류의 물건을 문자열로 우리는't 는 항상 그것이 무엇인지 알). 다음과 같은 단순한 문자 화이트 접근:
SELECT est.clients_ref
,TRANSLATE (
est.clients_ref
, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";<>?,./'
|| REPLACE (
TRANSLATE (
est.clients_ref
,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";<>?,./'
,'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
)
,'~'
)
,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";<>?,./'
)
clean_ref
에서 edms_staging_table est