Postgre에 작은 따옴표로 텍스트를 삽입합니다.SQL
가 test(id,name)
.
요.user's log
,'my user'
,customer's
.
insert into test values (1,'user's log');
insert into test values (2,''my users'');
insert into test values (3,'customer's');
위의 명령어 중 하나를 실행하면 오류가 발생합니다.
올바른 방법이 있으면 공유해 주세요.준비된 진술은 필요 없습니다.
sql excape mechanism으로 가능한가요?
스트링 리터럴
홑따옴표'
두 배로 늘려서 →''
"CHANGE: "CHANGE:
'user's log'
-- incorrect syntax (unbalanced quote)
'user''s log'
ASCII/ 39(ASCII/UTF-8 코드 39)가 `
RDBMS와 ('RDBMS Postgres에는 특별한 목적이 없습니다."
, 로 사용합니다. , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .
이전 버전 또는 를 사용하여 계속 실행 중인 경우 또는 일반적으로 문자열 앞에E
Posix 이스케이프 문자열 구문을 선언하려면 백슬래시를 사용하여 이스케이프할 수도 있습니다.\
:
E'user\'s log'
백슬래시 자체는 다른 백슬래시를 사용하여 이스케이프됩니다.하지만 그것은 일반적으로 바람직하지 않다.
많은 작은 인용문이나 여러 층의 탈출에 대처해야 하는 경우 Postgre에서 지옥을 인용하는 것을 피할 수 있습니다.따옴표로 둘러싸인 문자열이 있는 SQL:
'escape '' with '''''
$$escape ' with ''$$
달러 견적 간의 혼동을 피하기 위해 각 쌍에 고유 토큰을 추가합니다.
$token$escape ' with ''$token$
이 값은 임의의 수의 레벨을 내포할 수 있습니다.
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
해 주세요.$
문자는 클라이언트소프트웨어에서 특별한 의미를 지녀야 합니다.당신은 또한 그것을 피해야 할 수도 있습니다.은 표준 는 해당되지 . 또는 psql 등의
이는 모두 PL/pgSQL 함수 또는 애드혹 SQL 명령어 작성에 매우 유용합니다.그러나 사용자 입력이 가능한 경우 응용 프로그램에서 SQL 주입으로부터 보호하기 위해 준비된 문이나 다른 방법을 사용해야 하는 필요성을 줄일 수는 없습니다.@크레이그의 대답은 더 많다.상세:
포스트그레스 내의 값
데이터베이스 내의 값을 다룰 때 문자열을 올바르게 따옴표로 묶기 위한 몇 가지 유용한 함수가 있습니다.
quote_literal()
또는 - 후자는 따옴표로 둘러싸지 않은 문자열을 출력합니다.NULL
inputdisput.disput의 경우.
또한 유효한 SQL 식별자를 가져오는 데 필요한 문자열을 이중 따옴표로 묶어야 합니다.format()
형식 지정자를 사용하여%L
quote_nullable()
.
예를 들어 다음과 같습니다.format('%L', string_var)
-
concat()
concat_ws()
Postgre에 따르면SQL 매뉴얼(4.1.2.1). 문자열 상수:
문자열 상수 내에 단일 따옴표 문자를 포함하려면 'Dianne's horse'와 같이 인접한 두 개의 작은 따옴표를 작성합니다.
백슬래시를 사용한 이스케이프가 기능하는지 여부를 제어하는 파라미터도 참조하십시오.
어플리케이션에 틈이 있는 SQL 주입 구멍이 있을 가능성이 높기 때문에 이 문제는 매우 많은 문제가 되고 있습니다.
매개 변수화된 문을 사용해야 합니다.Java의 경우 자리 표시자와 함께 사용합니다.파라미터화된 스테이트먼트를 사용하고 싶지 않다고는 하지만 그 이유를 설명하지 않습니다.솔직히 파라미터화된 스테이트먼트는 해결하려고 하는 문제를 해결하는 가장 간단하고 안전한 방법이기 때문에 사용하지 않는 것이 매우 좋은 이유일 것입니다.
Java에서 SQL 주입 방지를 참조하십시오.바비의 다음 희생자가 되지 마세요
PgJDBC에는 문자열 따옴표 및 이스케이프를 위한 공용 기능은 없습니다.그것은 부분적으로 그것이 좋은 생각처럼 보이게 할 수도 있기 때문이다.
견적 기능이 내장되어 있습니다.quote_literal
★★★★★★★★★★★★★★★★★」quote_ident
에서는이지만 SQL용입니다.PL/PgSQL
「」를 사용하는 EXECUTE
.요즘은quote_literal
됩니다.EXECUTE ... USING
매개 변수화된 버전입니다. 더 안전하고 쉽기 때문입니다.서버측 기능이기 때문에 여기서 설명하는 용도로 사용할 수 없습니다.
그 어떤 이 일어날지 상상해 보세요.');DROP SCHEMA public;--
악성 사용자로부터 보호됩니다.을 사용하다
insert into test values (1,'');DROP SCHEMA public;--');
두 개의 문장과 무시되는 코멘트로 요약됩니다.
insert into test values (1,'');
DROP SCHEMA public;
--');
와, 데이터베이스가 사라졌네요.
값을 '
추가 정보를 .'
insert into test values (1,'user''s log');
insert into test values (2,'''my users''');
insert into test values (3,'customer''s');
postrgesql chr(int) 함수를 사용할 수 있습니다.
insert into test values (2,'|| chr(39)||'my users'||chr(39)||');
Pg 내에서 작업을 완료해야 하는 경우:
to_json(value)
https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE
Postgre에 값을 삽입하기 위해 Python을 사용했을 때SQL, 저는 "xxx" 열은 존재하지 않는다는 질문도 받았습니다.
이유를 wiki.postgresql에서 찾을 수 있습니다.
PostgreSQL은 이 문제에 대해 단일 따옴표만 사용합니다(예:
WHERE name = 'John'
큰따옴표는 시스템 식별자, 필드 이름, 테이블 이름 등 따옴표로 묶습니다.WHERE "last name" = 'Smith'
).
MySQL은`
시스템 식별자를 인용하는 데 사용됩니다.이것은 표준이 아닌 것이 확실합니다.
Postgre를 의미합니다.SQL은 필드 이름, 테이블 이름 등에 단일 따옴표만 사용할 수 있습니다.따라서 단일 따옴표를 값으로 사용할 수 없습니다.
내 상황은: Postgre에 "Sb와 Sb의 차이" 값을 삽입하고 싶다.SQL.
이 문제의 해결 방법:
를 로 치환하고 를 로 치환합니다.Postgre i 。SQL 값은 이중 따옴표를 지원하지 않습니다.
따라서 다음 코드를 사용하여 값을 삽입할 수 있습니다.
insert into test values (1,'user’s log');
insert into test values (2,'my users');
insert into test values (3,'customer’s');
작은따옴표를 하나 더 추가해야 합니다.-> '는 다음과 같이 큰따옴표로 묶어야 합니다.-> '는 표준적인 방법으로 동작합니다.
잘못된 방법: '사용자 로그'
올바른 방법: '사용자 로그'
문제:
insert into test values (1,'user's log');
insert into test values (2,''my users'');
insert into test values (3,'customer's');
솔루션:
insert into test values (1,'user''s log');
insert into test values (2,'''my users''');
insert into test values (3,'customer''s');
언급URL : https://stackoverflow.com/questions/12316953/insert-text-with-single-quotes-in-postgresql
'programing' 카테고리의 다른 글
bash 스크립트에 타임스탬프 변수 생성 (0) | 2023.04.19 |
---|---|
"shallow" 복사 사전을 업데이트하면 "original" 사전이 업데이트되지 않는 이유는 무엇입니까? (0) | 2023.04.19 |
Items Control을 가상화하시겠습니까? (0) | 2023.04.19 |
블록으로 '셀프' 사이클 유지 (0) | 2023.04.19 |
어레이/어레이 목록에서 링크된 목록을 사용하는 경우 (0) | 2023.04.19 |