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


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.