sourcecode

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

copyscript 2023. 5. 29. 11:06
반응형

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

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

예:

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 사용)

이 일을 피할 방법을 아는 사람?

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

저는 텍스트 앞에 'E'가 있어야 한다는 것을 나타내는 토론을 발견했습니다.

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

이것은 경고를 억제했지만, 텍스트는 여전히 올바르게 반환되지 않았습니다.마이클이 제안한 대로 슬래시를 추가했더니 효과가 있었습니다.

다음과 같은 경우:

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

멋져.

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

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

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

문자열에 백슬래시를 사용하고 있으므로 경고가 발생합니다.메시지가 표시되지 않도록 하려면 "set standard_compating_compating=on;" 명령을 입력합니다.그런 다음 postgresql에서 해석할 백슬래시를 포함하여 문자열 앞에 "E"를 사용합니다.

Postgres가 입력 시 데이터를 잘라낼 가능성은 매우 낮다고 생각합니다. 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=>

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

삽입됨 \n 삽입되지 않음

또는

삽입됩니다.

그렇지 않을 것입니다.

또한 어떤 인터페이스를 사용하고 있습니까?도중에 무언가가 당신의 허리띠를 잡아먹고 있을 가능성이 있습니까?

언급URL : https://stackoverflow.com/questions/935/string-literals-and-escape-characters-in-postgresql

반응형