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 를 통 해 바이트 배열 길이 함수 나 다른 유사 함 수 를 가 져 와 문자열 길 이 를 가 져 오 면 이 상황 을 피 할 수 있 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redmine 데이터베이스를 MySQL에서 PostgreSQL로 마이그레이션 (보충)Redmine 의 Database 를 MySQL 로 운용하고 있었습니다만, MySQL 5.6 이상이나 MariaDB 에는 , , 이러한 티켓이 수년 동안 방치된 상황을 감안하여, PostgreSQL로 마이그레이션하기...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.