PostgreSQL 은 표 에 보이 지 않 는 모든 문 자 를 제거 합 니 다.

3618 단어 PostgreSQL문자
문제 설명
데이터베이스 의 일부 데이터 에는 보이 지 않 는 문자 가 포함 되 어 있다.ASCII 코드 의 0-31,127 은 제어 문자 로 보이 지 않 습 니 다.
이 보이 지 않 는 문자 들 은 종종 필요 하지 않 으 니,우 리 는 그것 을 삭제 할 방법 을 생각해 야 한다.
해결 방법
모든 필드 에 보이 지 않 는 문 자 를 빈 칸 으로 바 꾸 는 함 수 를 쓰 십시오.
테스트 프로 세 스
환경 준비
표를 만 들 고 보이 지 않 는 문자 가 있 는 기록 을 삽입 합 니 다.주:다음 데이터 의 보이 지 않 는 문 자 는 붙 여 넣 을 때 자동 으로 지 워 집 니 다.ALT+숫자 키 를 누 르 고 가입 하 십시오.

CREATE TABLE public.test_table
(

 xm character varying(50),
 pinyin character varying(200),
 sm character(15)
)
WITH (
 OIDS=FALSE
);
ALTER TABLE public.test_table
 OWNER TO postgres;


-- ----------------------------
-- Records of test_table
-- ----------------------------
INSERT INTO ry_syrk_copy VALUES ('   xx', 'xx  ','  ' );
INSERT INTO ry_syrk_copy VALUES ('  ', '  xx',' xx ' );
주:보이 지 않 는 문 자 는 CSDN 에서 칠 수 없 기 때문에 xx 로 대체 합 니 다.실제로 다른 곳 에 서 는 ALT+숫자 키 로 인쇄 할 수 있다.
표 의 모든 보이 지 않 는 문 자 를 제거 합 니 다.

--     :  test_table            
CREATE OR REPLACE FUNCTION delete_special_char() RETURNS int8 AS $$
DECLARE
 row RECORD;  
BEGIN

--               
FOR row in select column_name from information_schema.columns where table_name = 'test_table' and data_type like 'character%' LOOP 
 FOR i IN 1..31 LOOP --             (  chr(0)  )
  EXECUTE 'update test_table set ' || row.column_name || ' = replace(' || row.column_name || ', chr(' || i || '), '' '' )';
 END LOOP;   
END LOOP;

RETURN 1;

END;

$$ LANGUAGE plpgsql;
실행 함수
실행 함수 Cselect*from deletespecial_char(),이후 표 데 이 터 를 보면 보이 지 않 는 모든 문자 가 빈 칸 으로 대 체 됩 니 다.
보충 C chr 삭제 방법(0)
주의해 야 할 것 은 상기 함수 가 chr(0)의 보이 지 않 는 문 자 를 삭제 할 수 없다 는 것 입 니 다.다음 테스트 를 보십시오.

그러나 Oacle 에서 상술 한 문 구 는 성공 적 으로 실 행 될 수 있 습 니 다.다음은 제 가 말씀 드 리 겠 습 니 다~
Oracle 에서 varchar 2 필드 의 보이 지 않 는 문자 처리
이전 항목 에서 암호 화 된 문자열 데이터 가 분실 되 어 암호 화 내용 이 정상적으로 복호화 되 지 않 는 경우 가 있 었 습 니 다.원인 을 찾 아 보 니 데이터베이스 시트 의 varchar 2 필드 에 chr(0)의 보이 지 않 는 문자(즉,우리 가 일반적으로 말 하 는\0)가 있 었 습 니 다.이러한 상황 이 발생 했 을 때 자바 와 c+에서 문자열 처리 가 다 르 기 때문에가 져 온 문자열 의 길이 가 다 를 수 있 습 니 다.
자바 에서 문자열 의 길 이 는 문자열 의 바이트 배열 을 통 해 얻 을 수 있 습 니 다.이 문자열 의 길 이 는 문자열 의 실제 크기(한자 2 바이트,기타 1 바이트)입 니 다.c++에서 strlen 함 수 를 통 해 얻 은 문자열 의 길 이 는 첫 번 째 바이트\0 이전의 문자 길이 입 니 다.
jni 를 작성 할 때 자바 의 문자열 을 c++의 문자열 로 변환 하 는 경우 가 많 습 니 다.자바 의 문자열 이\0 의 빈 바이트 가 포함 되 어 있 을 때 c+변환 후의 문자열 에 길 이 를 구 할 때 strlen 함 수 를 사용 하지 마 십시오.그렇지 않 으 면\0 바이트 전의 내용 에 만 길 이 를 구 합 니 다.실제 크기 와 다 릅 니 다.
이런 문 제 를 해결 하려 면 소속 응용 에 따라 세 가지 수단 으로 해결 할 수 있다.
데이터베이스 계층 에서 해결:
Oracle 데이터베이스 에 서 는 검색 어 에서 함수 replace 를 사용 하여 문자열 의 보이 지 않 는 문 자 를 제거 할 수 있 습 니 다.예 를 들 어:
select replace(content,chr(0),null) from bossquery_request where sky_command = '02';
나중에 유사 한 상황 이 발생 하면 replace(필드 이름,chr(ASCII 코드 값),null)를 통 해 해당 하 는 ASCII 코드 값 의 문 자 를 제거 할 수 있 습 니 다.
자바 프로그램 에서 해결:
자바 프로그램 에 서 는 String 대상 의 모든 바이트 내용 을 가 져 와 바이트 내용 을 스 캔 하여 필요 하지 않 은 바 이 트 를 제거 할 수 있 습 니 다.
JNI 층 에서 해결:
JNI 층 에서 이 문 제 를 해결 하 는 방법 은 strlen 함수 로 문자열 길 이 를 가 져 오지 말고 GetArray Length 를 통 해 바이트 배열 길이 함수 나 다른 유사 함 수 를 가 져 와 문자열 길 이 를 가 져 오 면 이 상황 을 피 할 수 있 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기