아포스트로피가 포함 된 값을 삽입하는 방법 (작은 따옴표)?


310

아포스트로피가있는 값을 삽입하는 올바른 SQL 구문은 무엇입니까?

Insert into Person
  (First, Last)
Values
  'Joe',
  'O'Brien'

O 다음의 아포스트로피가 값의 끝 태그라고 생각할 때 오류가 계속 발생합니다.


16
SQL 인젝션 공격에 노출되어 있지 않은지 확인하십시오. 가능하면 매개 변수를 사용하십시오.
앤드류

어떤 스크립팅 언어를 사용하고 있습니까? 예를 들어, PHP에는이 기능을 올바르게 수행하는 기능이 있습니다.
philfreo

Andrew의 동의 :이 질문이 SQL 클라이언트 또는 "쿼리 브라우저"등을 통해 SQL을 실행하는 것과 관련이 있고 실제로 프로덕션 코드의 어딘가에 있지 않기를 바랍니다. 매개 변수화 된 명령문을 사용하지 않는 것은 어리석은 일입니다.
charstar

실제로 코드에 있습니다 .. 매개 변수가있는 쿼리가 있으면 동일한 작업을 수행하지 않아도됩니까?
leora 2009

2
부정. 사용중인 데이터베이스 및 드라이버에 따라 매개 변수 분리가 다르게 처리 될 수 있지만 매개 변수화 된 명령문의 매개 변수는 이스케이프가 필요하지 않습니다. 참조 en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

답변:


485

SQL에서 아포스트로피를 피하십시오 (즉, 작은 따옴표 문자를 두 배로 늘림).

INSERT INTO Person
    (First, Last)
VALUES
    ('Joe', 'O''Brien')
              /\
          right here  

SELECT 쿼리에도 동일하게 적용됩니다.

SELECT First, Last FROM Person WHERE Last = 'O''Brien'

아포스트로피 또는 작은 따옴표는 문자열 데이터의 시작과 끝을 지정하는 SQL의 특수 문자입니다. 즉, 문자를 리터럴 문자열 데이터의 일부로 사용 escape하려면 특수 문자 가 필요합니다 . 작은 따옴표를 사용하면 일반적으로 따옴표를 두 배로 늘립니다. (작은 따옴표 대신 큰 따옴표가 아닌 두 개의 작은 따옴표 문자)

참고 : 원시 SQL 인터페이스를 통해 수동으로 데이터를 편집 할 때 개발 및 테스트 외부에서 쿼리를 작성하는 일은 드물기 때문에이 문제에 대해서만 걱정해야합니다. 코드에는 특수 문자 이스케이프 처리, SQL 주입 등 을 처리하는 기술 및 프레임 워크 (스택에 따라 다름)가 있습니다 .


6
$ linkQuestion = str_replace ( " '", "' '", $ linkQuestion); (
가려워 요

데이터가 Person에 삽입 (첫 번째, 마지막) 값 'Joe', 'Father 's shop'인 경우 어떻게됩니까?
vijesh

37

작은 따옴표를 두 배로 늘려야합니다 ...

insert into Person (First, Last)
values ('Joe', 'O''Brien')

21

아포스트로피를 피해야합니다. T-SQL 에서는 이중 아포스트로피를 사용하므로 insert명령문이 다음과 같이됩니다.

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'

AFAIK는 Values중괄호로 묶어야합니다. (@JustinNiessner와 같은 답이됩니다)
qwerty_so

15

작은 따옴표는 문자열의 시작과 끝을 나타내는 데 사용되기 때문에; 당신은 그것을 탈출해야합니다.

짧은 대답은 ''SQL 데이터베이스가 값을로 저장하기 위해 두 개의 작은 따옴표를 사용 하는 것 '입니다.

들어오는 값을 삭제하려면 REPLACE를 사용하십시오.

당신은 확인하고 싶은 '''', 그리고 그들이 함께 문자열에있는 경우 교체 ''''''고독한 작은 따옴표를 탈출하기 위해.


3

eduffy는 좋은 생각을 가지고있었습니다 . 코드 예제에서 방금 가져 왔습니다. JavaScript 또는 SQLite에서 아포스트로피를 악센트 기호로 바꿀 수 있습니다.

그는 O'Brian에서 아포스트로피를 교체하는 대신 악센트 기호를 문자열의 구분 기호로 배치했습니다. 이것은 사실 대부분의 경우 매우 간단한 솔루션입니다.


위대하고 훨씬 간단한 해결책이며 제 이름은 O`Reilly입니다!
PhillipOReilly

어쨌든 이스케이프 문자를 사용하는 것이 좋습니다. 실수로 :) 나는 키보드를 사용하고있는 날부터. 문서를 쓰는 동안 작은 따옴표 대신 실수로 악센트 기호를 사용하고 있습니다. (그러나 코드에서 '를 문자 식별자로 사용합니다). 작년에 누군가 누군가 자신의 비밀번호를 말하고 시스템에 로그인 할 수 없었습니다. '로`를 입력하는 시간까지 우리는 알아낼 수 없었다.
Learner


2

작은 따옴표는 두 배로 확대하여 이스케이프 처리합니다 .

다음 SQL은이 기능을 보여줍니다.

declare @person TABLE (
    [First] nvarchar(200),
    [Last] nvarchar(200)
)

insert into @person 
    (First, Last)
values
    ('Joe', 'O''Brien')

select * from @person

결과

First   | Last
===================
Joe     | O'Brien

0

값 주위에 큰 따옴표를 사용하십시오.

insert into Person (First, Last) Values("Joe","O'Brien")

3
비록 이것이 Informix를 알고 있지만 하나의 DBMS라는 것은 이것이 표준 SQL이 아니라는 것을 명심하십시오. He said, "Don't!"작은 따옴표 및 / 또는 큰 따옴표 사용 과 같이 문자열을 삽입하는 방법도 설명해야 합니다. 'He said, "Don''t!"'또는 "He said, ""Don't!""". 수락 된 답변이있는 오래된 질문에 새 답변을 추가 할 때는 새롭고 완전한 정보를 제공해야합니다. 큰 따옴표를 사용하는 것은 새로운 것이지만 몇 가지 DBMS로 제한됩니다. 당신은 그것을 받아들이는 것 중 적어도 하나를 식별하기 위해 고통을 가져야합니다.
Jonathan Leffler

-1

대신 ~ 키로 백틱을 사용하십시오.

`O'Brien`

1
그렇다면 문제는 백틱을 삽입하는 방법입니다.
Jasper de Vries

1
이것이 "올바른"답은 아니지만, 나는 이것을 가지고 있지 않은 일련의 이름으로 일하고 있으며, 한 번의 작업을하고 있으므로 즉시 문제를 해결했습니다. 감사!
nscalf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.