database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7426 게시물 읽기
No. 7426
백슬레쉬가 들어가 select가 안됩니다. 어떻게 처리해야 되는지요??(처리방법 올렸습니다. 답글부탁드립니다^^)
작성자
박근준(롱다리)
작성일
2008-05-23 09:40ⓒ
2008-05-26 11:19ⓜ
조회수
8,225

자료 입력 중에 백슬레쉬가 들어가 버려 조회가 안되는 상황이 발생되었습니다.
해당 날자를 피해서 조회를 하면 잘되는데 

백슬러쉬가 들어간 날자의 자료를 조회 하면 안되네요 . . . ㅠ.ㅠ

그래서 dump받아서 iconv로 없애고 다시 restore 할려고 했는데 .. 
dump 받은 파일이 2기가를 훌쩍 넘어가 버려서 
iconv가 너무 큰 자료라고 작동하기를 포기해 버렸습니다.

어떻게 해결하는 것이 좋을지 고수님들의 고견을 부탁드립니다.
(백슬러쉬가 들어간개 생각보다 많습니다. 20건 이상  . .  ㅜ.ㅜ )

감사합니다. ^^

이 글에 대한 댓글이 총 11건 있습니다.

될텐데요? 입력된 데이터가 '2008\05\23'  이라면 where data='2008\\05\\23' 하면 되지 않나요?

그냥님이 2008-05-23 09:50에 작성한 댓글입니다. Edit

그냥님 답변 감사드립니다 .. . ^^


자료중에 특정하게 백슬레쉬가 들어간 것이 아니고


간단한 비고란이 있는데 그곳에 자유롭게 적는 중에 들어갔습니다.


그래서 조회상으로 조치를 취할수가 없네요 . . .


그래서 생각해낸게 백슬레쉬만 삭제가 가능한지 아니면

그곳의 비고란 자료를 모두 없애 버릴수 있는지 싶어서요


답변감사드로고요 . . .


좋은 방법 부탁드립니다. ^^

감사합니다.

롱다리님이 2008-05-23 11:19에 작성한 댓글입니다. Edit
update table set data=replace( data, '\\', '') where data like '%\\%' 
그냥님이 2008-05-23 11:29에 작성한 댓글입니다.
이 댓글은 2008-05-23 12:07에 마지막으로 수정되었습니다. Edit

그냥님 그대로 해보았는데요 ..  안되네요 . . . .


감사합니다. ^^

롱다리님이 2008-05-23 13:59에 작성한 댓글입니다. Edit

그대로 해보다니요 시험해보고 적용하셔야죠 위험하게요....

백슬레시가 일반 백슬레시가 아닌듯 하네요 

해당 예제와 쿼리 오류상황을 올려주시면 다른분이 보시고 도움을 주실수 있을겁니다

그냥님이 2008-05-23 16:05에 작성한 댓글입니다.
이 댓글은 2008-05-23 16:08에 마지막으로 수정되었습니다. Edit

테스트 db에서 동일한 환경을 만들어 놓고 테스트한겁니다.

걱정해 주셔서 감사합니다. ^^


테이블명 : test

컬럼 : id (char10) , remark (varchar 200)

키 : id


remark 란에  ' 구매금액 : \360000원 '

 이라고 입력해 놓았는데요   


select * from test where id = '0000000001' ;


하면 에러 메세지가

'invalid byte sequence for encoding "UTF8":0x9d ' 라고 납니다.


참고로 서버 encoding = 'UNICODE' 이고요   .. . 

client_encoding = 'uhc' 로 하고 작업중입니다.


이 것은 모든 서버 버젼에서 나타납니다.


도움부탁드립니다, 감사합니다. ^^

롱다리님이 2008-05-23 17:18에 작성한 댓글입니다.
이 댓글은 2008-05-23 17:18에 마지막으로 수정되었습니다. Edit

\ 가 들어간 문자열이


숫자에 대해서 오류가 발생할텐데..

그 숫자가 (여기서는 가격이 되겠죠?)

4자리 이상이라면 가능하지만

그렇지 않다면 힘들거 같습니다.


그리고

이는 DB 자체적으로는 해결하기 힘들거 같고

응용프로그램을 이용해야 할 거 같네요..




 

tmp=> create table t (r text);

CREATE TABLE

Time: 131.739 ms

tmp=> insert into t values ('\36000');

WARNING:  nonstandard use of escape in a string literal

LINE 1: insert into t values ('\36000');

                              ^

HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.

INSERT 0 1

Time: 1.230 ms

tmp=> insert into t values ('가격: \36000');

WARNING:  nonstandard use of escape in a string literal

LINE 1: insert into t values ('가격: \36000');

                              ^

HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.

INSERT 0 1

Time: 0.727 ms

tmp=> select * from t;

ERROR:  invalid byte sequence for encoding "UTF8": 0xf03030

HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

tmp=> select decode(r, 'escape') from t;

              decode             

----------------------------------

 \36000

 \352\260\200\352\262\251: \36000

(2 rows)

 

이런식으로 나오게 되는데

\36000 처럼 4자리 이상이면 이것이 \숫자 라는 것이 ㅚ지만

3자리 이하라면 좀 곤란한 문제가 발생하겠네요..


일단 저런 쿼리를 응용프로그램에서 수행하여

문자열 중 \ 로 시작하고 숫자이며 4 자리 이상의 것을 취해서

역슬래쉬를 제거하면  (ereg_replace() 같은함수를 써서 정규표현식으로 히환해야겠지요?)


이런식으로되겠죠?

36000

\352\260\200\352\262\251: 36000


이것을 DB 에 업데이트 해야 겟지요


아마도 이런식이면 될거 같습니다.


$query = "update table set col = E'$str' where seq = $seq";

혹은

$query = "update table set col = encode(E'$str::bytea, 'escape') where seq = $seq";


성공하시길..



<참고1> DB 에서 utf8 에러가 났다면

2기가가 아니라 2K 이어도 iconv 변환 에러 납니다.

iconv 로 무모한 시도는 하지 마시길..


<참고2> 덤프가 2기가라면.. 자료가 꽤 많을거 같은데..

일일이 하나하나 업데이트 해야 하므로 시간이 꽤 걸릴거 같습니다.



 

tyro님이 2008-05-23 21:07에 작성한 댓글입니다. Edit

Welcome to psql 8.3.1, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

test=# create table t (r text);
CREATE TABLE
test=# insert into t values ('\36000');
WARNING:  nonstandard use of escape in a string literal
LINE 1: insert into t values ('\36000');
                              ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
ERROR:  invalid byte sequence for encoding "UTF8": 0xf03030
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
test=# select * from t;
 r
---
(0 rows)

8.3.1에서는 입력에서 에러로 막는군요....

그냥님이 2008-05-23 21:20에 작성한 댓글입니다. Edit

8.2 에서는 

conf 에서
기본값인지 모르겟찌만 제가 셋팅해놓은건

escape_string_warning = on 이 주석처리 되어 있네요

입력허용(on)/불허(off) 의문제는 이 설정 때문이 아닌가 ..생각해봅니다.


기존 프로그램 (트리거 및 등등) 고치기 귀찮아서 고칠것도 많고 해서 아마도 제가 주석처리해놓은듯 합니다만...

tyro님이 2008-05-23 23:33에 작성한 댓글입니다.
이 댓글은 2008-05-23 23:34에 마지막으로 수정되었습니다. Edit

지금까지 진행상황입니다.

텍스트 자료중 백슬레쉬가 들어간 dump파일을 restore 하게 되면 copy 중 그라인에서 에러를
내고 맙니다.

그래서 복구가 안되고 있습니다.

처리 가능한 방법으로는 tyro님이 말씀하신 대로 하니까 건건이 처리는 가능했습니다.
감사합니다. ^^ ( 자료가 너무많아 아직 시행하지는 못하고 있습니다. 테스트만 마친상태임)

그리고 postgresql.conf 파일에서 이렇게 백슬레쉬를 막기위해서 escape_string_warning = on 을
해주면 unicode 상태에서 정상적으로 작동하여 백슬레쉬 입력을 원천적으로 막아지는 것을 확인
했습니다.

그런데 문제를 한가가 발견했습니다.

server_encoding = 'UNICODE' (UTF8) 인상태에서 테스트를 해 보았는데요 . . .
client_encoding = 'UNIOCDE'(UTF8) 인상태에서는 원천적으로 막아지나..
client_encoding = 'uhc' 상태로 작업중에는 에러메세지만 보이고 입력이 됩니다.

다들 주의 해 주세요. . . ( 물론 저처럼 게을러서 프로그램에서 처리 루틴이 없는 분들 ㅎㅎㅎ)

편법으로 처리 방법입니다.

iconv 를 이용하여 utf8 에서 cp949 로 변경 후 그것을 다시 cp949 에서 utf8 로 변환하면 dmp파일을
사용할수 있습니다. 물론 백슬레쉬가 들어가 것은 '\1E,000' 런 형식으로 바뀌지만요 . . . .

여기까지 하고 나니까 저에게 또다른 문제가 발생했습니다.....

iconv 로는 2G짜리를 돌릴 수 없다는 겁니다. ㅠ.ㅠ    
고수님들 iconv 로 처리할수 있는 방법이 있으면 자문을 주십시요 . . .  부탁드립니다... ㅜ.ㅜ
감사합니다.

박근준(롱다리)님이 2008-05-26 11:18에 작성한 댓글입니다.
http://database.sarang.net/?inc=read&aid=7400&criteria=pgsql&subcrit=qna
에 스크립트 있던데요 참고하세요
그냥님이 2008-05-26 12:45에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
7429psql -l 에서 에러가...TT [1]
이진수
2008-05-24
6737
7428생성된 데이타베이스를 모두 보는 명령어 [2]
이진수
2008-05-24
6716
7427mysql과 post의 인덱스 조건식에 대해서 [1]
이지영
2008-05-23
5904
7426백슬레쉬가 들어가 select가 안됩니다. 어떻게 처리해야 되는지요??(처리방법 올렸습니다. 답글부탁드립니다^^) [11]
박근준
2008-05-23
8225
7425생성한 function의 내용을보고싶습니다. [2]
서정주
2008-05-20
6553
7424PostgreSQL 8.2 와 8.3 의 차이? [2]
김대청
2008-05-15
6317
7423PostgreSQL 8.1.9번전 SQL_ASCII에서 EUC_JP 변경 [1]
박재우
2008-05-14
6554
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다