アポストロフィ(一重引用符)を含む値を挿入する方法は?


310

アポストロフィを含む値を挿入するための正しいSQL構文は何ですか?

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

Oの後のアポストロフィが値の終了タグであるため、エラーが発生し続けます。


16
SQLインジェクション攻撃にさらされていないことを確認してください。可能な限りパラメータを使用してください。
アンドリュー、

どのスクリプト言語を使用していますか?PHPには、これを正しく行うための関数などがあります。
philfreo 2009

ここでAndrewに同意します。この質問がSQLクライアントまたは「クエリブラウザー」などを介してSQLを実行することのみに関するものであり、実際に本番コードのどこかにないことを願っています。パラメータ化されたステートメントを使用しないのは愚かです。
charstar 2009

実際にはコード内にあります。パラメーター化されたクエリがあった場合、同じことをする必要はありませんか?
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は、特殊文字を使用する必要があります。単一引用符を使用すると、これは通常、引用符を2倍にすることで達成されます。(単一引用符ではなく、二重引用符ではなく、2つの単一引用符文字。)

:この問題について心配する必要があるのは、生のSQLインターフェースを介して手動でデータを編集する場合のみです。開発およびテスト以外でクエリを作成することはまれです。コードには、特殊文字のエスケープ、SQLインジェクションなどを処理するテクニックとフレームワーク(スタックによって異なります)があります。


6
$ linkQuestion = str_replace( "'"、 "' '"、$ linkQuestion);(これは読みにくいです)
user462990

データがInsert into Person(First、Last)Values 'Joe'、 'Father's shop'の場合はどうなりますか。
ビジェシュ


21

アポストロフィをエスケープする必要があります。ではT-SQLこれは二重のアポストロフィであるので、あなたのinsert文は次のようになります。

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

私の知る限り、Values中括弧で囲む必要があります(これにより@JustinNiessnerと同じ答えになります)
qwerty_so

15

単一引用符は文字列の開始と終了を示すために使用されるため、あなたはそれを脱出する必要があります。

短い答えは''、SQLデータベースが値を格納するために、2つの単一引用符を使用すること'です。

REPLACEを使用して入力値を無害化する方法を見てください。

を確認し''''''''''単一の引用符をエスケープするために文字列内に存在する場合はそれらを置き換えます。


3

エダフィは良い考えを持っていました。彼は自分のコード例でそれを逆にしただけです。JavaScriptまたはSQLiteのいずれかで、アポストロフィをアクセント記号に置き換えることができます。

彼は(たぶん私は確信している)O'Brianのアポストロフィの代わりにアクセント記号を文字列の区切り文字として配置しました。これは実際、ほとんどの場合、非常にシンプルなソリューションです。


非常にシンプルなソリューションで、私の姓はO`Reillyです。
PhillipOReilly

とにかく、エスケープ文字を使用することをお勧めします。偶然:)私がキーボードを使用している日以来。ドキュメントの作成中に、シングルクォートの代わりにアクセント記号を誤って使用しています。(ただし、コードでは 'を文字識別子として使用しています)。昨年まで誰かが彼のパスワードを教えてくれて、彼のシステムにログインできませんでした。私は何時間も私が 'を `として入力していることを理解できませんでした。
学習者


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
これは標準SQLではないことに注意してください。私はInformixを知っていますが、1つのDBMSでそれを許可しています。また、He said, "Don't!"一重引用符や二重引用符を使用するなど、文字列を挿入する方法にも対処する必要があります。これは次のように実行できます:'He said, "Don''t!"'または"He said, ""Don't!"""。回答が承認された長年の質問に新しい回答を追加する場合は、新しく完全な情報を提供する必要があります。二重引用符の使用は新しいものですが、一部のDBMSに限定されています。あなたはそれらを受け入れるそれらの少なくとも1つを識別するために骨の折れるべきです。
ジョナサンレフラー

-1

代わりに(〜キーで)バックティックを使用してください。

`O'Brien`

1
それから問題は:バックティックを挿入する方法?
Jasper de Vries

1
これは「正しい」答えではありませんが、私はこれを持たない一連の名前で作業しており、1回限りの操作を行っているので、これで問題がすぐに解決しました。ありがとう!
nscalf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.