postgresql의 문자열 리터럴 및 이스케이프 문자


113

이스케이프 문자를 테이블에 삽입하려고하면 경고가 발생합니다.

예를 들면 :

create table EscapeTest (text varchar(50));

insert into EscapeTest (text) values ('This is the first part \n And this is the second');

경고를 생성합니다.

WARNING:  nonstandard use of escape in a string literal

( PSQL 8.2 사용 )

누구든지이 문제를 해결하는 방법을 알고 있습니까?

답변:


131

부분적으로. 텍스트가 삽입되지만 경고는 계속 생성됩니다.

텍스트 앞에 'E'가 있어야 함을 나타내는 토론을 찾았습니다.

insert into EscapeTest (text) values (E'This is the first part \n And this is the second');

이로 인해 경고가 표시되지 않았지만 텍스트가 여전히 올바르게 반환되지 않았습니다. Michael이 제안한대로 추가 슬래시를 추가하면 작동했습니다.

이와 같이 :

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');

5
PostgreSQL 9.0에서 E'testing \\ x20double-slash '는'testing \\ x20double-slash '로 평가되므로 단일 슬래시 접근 방식 만 E'string'스타일 리터럴에 대해 작동합니다
Alexander

2
PostgreSQL 9.2의 경우 다음을 참조하십시오. postgresql.org/docs/9.2/interactive/…
Pitt

psql \copy참고 : psql의`\ copy '메타 명령에 대한 쿼리 인수에서 사용할 때 개행 대신 E'\n'파일에 기록 된 것을 발견했습니다 '\n'.
Stew

40

멋있는.

E에 관한 문서도 찾았습니다.

http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS

PostgreSQL은 SQL 표준의 확장 인 "escape"문자열 상수도 허용합니다. 이스케이프 문자열 상수는 여는 작은 따옴표 바로 앞에 E (대문자 또는 소문자) 문자를 작성하여 지정됩니다 (예 : E'foo '). (줄에서 이스케이프 문자열 상수를 계속할 때는 첫 번째 여는 따옴표 앞에 E 만 쓰십시오.) 이스케이프 문자열 내에서 백 슬래시 문자 (\)는 백 슬래시와 다음 문자 ( s)는 특수 바이트 값을 나타냅니다. \ b는 백 스페이스, \ f는 폼 피드, \ n은 개행, \ r은 캐리지 리턴, \ t는 탭입니다. 또한 \ digits (digits는 8 진수 바이트 값을 나타냄)와 \ xhexdigits (hexdigits는 16 진수 바이트 값을 나타냄)도 지원됩니다. (생성 한 바이트 시퀀스가 ​​서버 문자 집합 인코딩에서 유효한 문자라는 것은 사용자의 책임입니다.) 백 슬래시 뒤에 오는 다른 모든 문자는 문자 그대로 사용됩니다. 따라서 백 슬래시 문자를 포함하려면 두 개의 백 슬래시 (\\)를 작성하십시오. 또한 ''의 일반적인 방법 외에도 \ '를 작성하여 이스케이프 문자열에 작은 따옴표를 포함 할 수 있습니다.


6

문자열에 백 슬래시를 사용하고 있기 때문에 경고가 발생합니다. 메시지를 표시하지 않으려면 "set standard_conforming_strings = on;"명령을 입력하십시오. 그런 다음 postgresql이 해석 할 백 슬래시를 포함하여 문자열 앞에 "E"를 사용합니다.


1
별로. standard_conforming_strings = on이 있고 명령을 실행 \copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E'\x7f'하면 parse error at "'\x7f'". standard_conforming_strings = off가있는 경우; E와 따옴표없이 위의 동일한 명령을 사용합니다 ... (DELIMITER AS \ x7f) 경고 메시지가 표시되지만 데이터가 제대로로드됩니다. 따라서 귀하의 진술은 정확할 수 있지만이 경우에는 그렇지 않습니다.

지금은 psql 명령을 사용하는 동안 SQL 문에서 문자열을 참조했습니다. \ copy 대신 COPY 명령을 사용하면 동일한 오류가 발생합니까?
eppesuig

1
이것이 정답입니다. 최신 버전의 PG는 이제 기본적으로 켜져 있습니다.
jpmc26

3

Postgres가 입력시 데이터를자를 가능성이 매우 낮습니다. 거부하거나있는 그대로 저장합니다.

milen@dev:~$ psql
Welcome to psql 8.2.7, 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

milen=> create table EscapeTest (text varchar(50));
CREATE TABLE
milen=> insert into EscapeTest (text) values ('This will be inserted \n This will not be');
WARNING:  nonstandard use of escape in a string literal
LINE 1: insert into EscapeTest (text) values ('This will be inserted...
                                              ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
INSERT 0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>

제가 준 테스트 케이스를 시도해 보시면 직접 확인하실 수 있습니다.
rjohnston

문제와 같은 흥미 외모는 텍스트가 데이터베이스에서 나오는 있기 때문에 매우 확실히 ... 잘리지 한 후 JDBC 드라이버에 있었다
rjohnston

3
Postgres 매우 특정한 상황에서 입력 데이터를 자릅니다. 예를 들어, character varying(4)입력 "test"(단어 뒤에 공백 2 개, 6 자)가 지정된 열은 공백을 잘라 내고 "test"값을 저장합니다. 그러나 일반적으로 Postgres가 데이터를 자르지 않고 오류가 발생한다고 가정 할 수 있습니다.
Bryson 2014 년

0

정말 어리석은 질문 : 문자열이 잘리고 있으며 지정한 줄 바꿈에서 끊어진 것이 아니라 (그리고 인터페이스에 표시되지 않을 수도 있음) 확실합니까? 즉, 필드가 다음과 같이 표시 될 것으로 예상합니까?

삽입됩니다. \ n

또는

이것은 삽입됩니다

이것은 아닙니다

또한 어떤 인터페이스를 사용하고 있습니까? 도중에 무언가가 백 슬래시를 먹고있을 가능성이 있습니까?


1
이것은 나에게 일어났다. 텍스트가 텍스트 상자에 삽입되고 소스를
봤으며
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.