발견하고 제거하는 비 ascii 문자에서 Oracle 로 varchar2

우리는 현재 중 하나를 마이그레이션 우리의 oracle 데이터베이스를 UTF8 고 우리가 발견되는 몇 가지 기록을 가까이 있는 4000 바이트 varchar 제한. 면 우리도 이러한 마이그레이션을 기록 그들은 실패로 그들의 문자를 포함하는 멀티바이트 UF8 문자입니다. 무엇을 원하는 내 PL/SQL 을 찾은 이러한 문자는 무엇을 보고 그들은 다음을 변경하거나 그들 또는 제거합니다.

내가 하고 싶은 것:

SELECT REGEXP_REPLACE(COLUMN,'[^[:ascii:]],'')

하지만 오라클를 구현하지 않[:ascii:]캐릭터 클래스입니다.

거기에 간단한 방법으로 일을 내가 무엇을 하시겠습니까?

질문에 대한 의견 (2)

사용하는 경우에는ASCIISTR기능을 변환하는 유니코드를 리터럴의 양식을\nnnn를 사용하여 다음을 수행할 수 있습니REGEXP_REPLACE스트립 그럴처럼,그래서...

UPDATE table SET field = REGEXP_REPLACE(ASCIISTR(field), '\\[[:xdigit:]]{4}', '')

...는 필드와 테이블은 당신의 분야와 테이블의 이름을 각각합니다.

해설 (3)

나는 생각이 될 것이:

SELECT REGEXP_REPLACE(COLUMN, '[^[:print:]]', '')
해설 (6)

나't 추천 프로덕션 코드,하지만 그것이 의미하고 작동하는 것 같다:

SELECT REGEXP_REPLACE(COLUMN,'[^' || CHR(1) || '-' || CHR(127) || '],'')
해설 (1)
해결책

에서 하나의 바이트 ASCII-compatible 인코딩(예:Latin-1),ASCII 문자는 단순히 바이트 범위 0~127. 그래서 같은 것을 사용할 수 있습니다[\x80-\xFF]을 감지하는 비-ASCII 문자입니다.

해설 (3)

선택처럼 보일 수 있습니다 다음 예제:

select nvalue from table
where length(asciistr(nvalue))!=length(nvalue)  
order by nvalue;
해설 (2)

이's 은 아마 더 직접적인 방법을 사용하여 정규표현식이 있습니다. 운으로,다른 누군가를 제공할 것입니다. 하지만 여기는's what I'd 할 필요 없이 이동한다.

을 만들 PLSQL 기능을받을 입력 문자열을 반환로 varchar2.

에 PLSQL 기능을 수행 asciistr()귀하의 입력이 있습니다. 이 PLSQL 기 때문입할 수 있는 문자열을 반환 4000 고 있는 32K 사용할 수 있로 varchar2 에 PLSQL.

는 기능을 변환하는 비-ASCII 문자\xxxx 로 표기. 그래서 정규 표현식을 사용할 수 있습을 찾고 제거하는 사람들. 그 결과입니다.

해설 (0)

다음과 같은 작동:

select dump(a,1016), a from (
SELECT REGEXP_REPLACE (
          CONVERT (
             '3735844533120%$03  ',
             'US7ASCII',
             'WE8ISO8859P1'),
          '[^!@/\.,;:#$%&()_=[:alnum:][:blank:]]') a
  FROM DUAL);
해설 (0)

내가 찾은 해답이 여기:

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);
해설 (0)

다음과 같이 하십시오.

-- 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
해설 (0)

나는 유사한 문제에 대한 블로그 그것은여기서. 을 시작 했을 정규 표현식을 위한 알파 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.

해설 (0)

당신이 뭔가를 시도 할 수 있습니다 다음과 같이 검색에 대한 열 포함하는 비-ascii 문자:

select * from your_table where your_col  asciistr(your_col);
해설 (0)

참고 사용할 때마다

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 입니다.

해설 (0)

감사,이에 대한 목적입니다. BTW 가 누락되었 single-견적에서 예상입니다.

REGEXP_REPLACE(COLUMN,'[^' || CHR(32) || '-' || CHR(127) || ']', ' '))

내가 사용하는 word-wrap 기능입니다. 때때로이 있었다는 임베디드 NewLine/NL/CHR(10)/0A 에 들어오는 텍스트는 장난하는 것입니다.

해설 (0)

응답에 의해 주어진 프란시스코 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).

해설 (0)

이렇게 오신 것을 환영합니다.

trim(replace(ntwk_slctor_key_txt, chr(0), ''))
해설 (1)

나는'm 는 조금 늦게 이 질문에 대답하지만,같은 문제를 가지고 있었습니다 최근에(사람들은 잘라내어 붙여 넣는 모든 종류의 물건을 문자열로 우리는't 는 항상 그것이 무엇인지 알). 다음과 같은 단순한 문자 화이트 접근:

SELECT est.clients_ref
  ,TRANSLATE (
              est.clients_ref
             ,   'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";?,./'
              || REPLACE (
                          TRANSLATE (
                                     est.clients_ref
                                    ,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";?,./'
                                    ,'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
                                    )
                         ,'~'
                         )
             ,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";?,./'
             )
      clean_ref

에서 edms_staging_table est

해설 (0)