はじめに
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