はじめに
MySQLのエスケープ処理について真面目に考えたことなかったので、簡単にまとめる。
その前にエスケープ関連の言葉をおさらい
エスケープの言葉をおさらいするだけでも結構スッキリした
エスケープ処理
プログラミング言語やソフトウェアで文字列を扱う際に、特定の記号文字などに続けて記された文字(の並び)に、その文字本来の意味とは異なる特別な意味や機能を与える
エスケープシーケンス
特殊な文字を、普通の文字の組み合わせで表現したもの
例えば、「\n」(「\」と「n」の組み合わせ)で改行を意味する(プログラミング言語によって異なるが)
エスケープ文字
2つの意味で使われている、意味が真逆なので文脈から読み取る必要がある
- 特別な意味を無効にするための文字
- 特別な意味を付与するための文字
サニタイジング
入力データの無害化で、エスケープ処理はその手段の一つ
特別な意味を無効にするための文字
「^a」はコンピュータでは「aではじまる文字列」と解釈されるが、「^a」と書くことで「^a」の二つの文字列と解釈される
ここでいうバックスラッシュがエスケープ文字にあたる
特別な意味を付与するための文字
エスケープシーケンスで説明した「\」(バックスラッシュ)のこと
MySQLではどんな文字がエスケープ処理されるのか
MySQLのエスケープシーケンス
エスケープシーケンス | シーケンスが表す文字 |
---|---|
\0 | ASCII NUL (0x00) 文字。 |
' | 単一引用符 (「'」) 文字。 |
" | 二重引用符 (「"」) 文字。 |
\b | バックスペース文字。 |
\n | 改行 (ラインフィード) 文字。 |
\r | 復帰改行文字。 |
\t | タブ文字。 |
\Z | ASCII 26 (Ctrl+Z)。表に続いて記されている注釈を参照してください。 |
\ | バックスラッシュ (「\」) 文字。 |
% | 「%」文字。表に続いて記されている注釈を参照してください。 |
_ | 「_」文字。表に続いて記されている注釈を参照してください。 |
エスケープされる例
select "hello\nworld"
hello
world
上記以外の文字に「\」(エスケープ文字)がついていても無視される
select "\h\e\l\l\o \w\o\r\l\d"
hello world
他の言語のエスケープシークエンスは?
html
エスケープ文字 | 文字 | 名称 |
---|---|---|
< | < | 小なり |
> | > | 大なり |
(半角スペース) | | 半角スペース |
& | & | アンパサンド |
© | © | コピーライト |
" | " | ダブルクォーテーション |
' | ' | シングルクォーテーション |
¥ | ¥ | 円マーク |
javascript
エスケープシーケンス | 意味 |
---|---|
¥b | バックスペース |
¥t | 水平タブ |
¥v | 垂直タブ |
¥n | 改行 |
¥r | 復帰 |
¥f | 改ページ |
¥' | シングルクオーテーション |
¥" | ダブルクオーテーション |
¥¥ | ¥文字 |
¥0 | NULL文字 |
¥xXX | 2桁のXX(16進数)が表すLatin-1文字 |
¥uXXXX | 4桁のXXXX(16進数)が表すUnicode文字 |
まとめ
MySQLがどの文字をエスケープするのかはまとめることでスッキリしたが、アプリケーション側でMySQLのエスケープ文字をどのように扱ってデータを保存しているのかを見ていきたい。
参考
この記事は以下の情報を参考にして執筆しました。
https://wa3.i-3-i.info/word11732.html
http://e-words.jp/w/%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E5%87%A6%E7%90%86.html
https://dev.mysql.com/doc/refman/5.6/ja/string-literals.html
https://pasomaki.com/html-escape/
https://www.javadrive.jp/javascript/num/index2.html