N''、CHAR()関数、クエリパラメータ:特殊な状況でのエスケープ
SQL Serverでシングルクォートをエスケープする方法
SQL Serverで文字列リテラル内にシングルクォートを含める場合、エスケープする必要があります。エスケープしないと、クエリ構文エラーが発生します。
エスケープ方法
シングルクォートをエスケープするには、2つの方法があります。
シングルクォートを2回繰り返す
例:
SELECT 'John''s hat'
この例では、John's hat
という文字列リテラルは、2つのシングルクォートで囲まれています。最初のシングルクォートは文字列リテラルの開始を示し、2番目のシングルクォートは最初のシングルクォートをエスケープします。
バックスラッシュ()を使用する
SELECT 'John\'s hat'
この例では、シングルクォートはバックスラッシュ()でエスケープされています。
どちらの方法を使用しても構いません。一般的には、シングルクォートを2回繰り返す方法の方が読みやすく、分かりやすいので、おすすめです。
その他の特殊文字
シングルクォート以外にも、以下の特殊文字はエスケープする必要があります。
- バックスラッシュ ()
- ダブルクォート (")
- 改行 (\n)
- キャリッジリターン (\r)
- タブ (\t)
これらの特殊文字をエスケープするには、バックスラッシュ()を使用します。
SELECT 'This is a \n new line.'
-- シングルクォートを2回繰り返す
SELECT 'John''s hat';
-- バックスラッシュを使用する
SELECT 'John\'s hat';
-- その他の特殊文字
SELECT 'This is a \n new line.';
-- バインド変数を使用する
DECLARE @name VARCHAR(50);
SET @name = 'John''s hat';
SELECT @name;
解説
- 最初の2つの例では、シングルクォートをエスケープする方法を示しています。
- 4番目の例では、バインド変数を使用して、シングルクォートを含む文字列リテラルを安全にクエリに挿入する方法を示しています。
実行方法
このコードをSQL Server Management Studio (SSMS)などのクエリ エディターで実行できます。
注意事項
- エスケープ処理は、SQL インジェクション攻撃を防ぐために重要です。
- 常に適切なエスケープ処理を行うようにしてください。
シングルクォートをエスケープするその他の方法
N'' を使用すると、文字列リテラルを Unicode 文字列として解釈できます。Unicode 文字列では、シングルクォートをエスケープする必要はありません。
SELECT N'John''s hat';
CHAR() 関数を使用して、文字コードを指定して文字列リテラルを作成できます。
SELECT CHAR(39) + 'John''s hat' + CHAR(39);
クエリ パラメータを使用すると、文字列リテラルをクエリに安全に挿入できます。
DECLARE @name VARCHAR(50);
SET @name = 'John''s hat';
EXEC sp_executesql N'SELECT @name', N'@name VARCHAR(50)', @name;
sql sql-server t-sql