3

mysql テーブルに格納する必要があるエスケープ文字を含む一連の正規表現があります。

バックスラッシュをエスケープしないと、削除されます。

mysql_real_escape_string、addslashes、str_replace を使用して PHP でバックスラッシュをエスケープしようとしましたが、データベースが単一のバックスラッシュではなく二重のバックスラッシュを格納するたびに。

また、bash で sed を使用してバックスラッシュをエスケープしようとしましたが、2 も出力されます。

例:

$regex = "stackoverflow\.com\/questions\/ask";
$query_text = addslashes($regex);
$query = "INSERT INTO my_table (url) VALUES ('$query_text')";

me@server:$ echo "select * from my_table" | mysql -uuser -Ddatabase -p'password'

stackoverflow\\.com\\/questions\\ask

私が間違っていることについてのアイデアはありますか?

4

1 に答える 1

9

スラッシュは、mysqlクライアントのコンソール出力でエスケープされます。データベースにありません;)

クライアントをインタラクティブに実行してみてください。

mysql -uuser -Ddatabase -p'password'
mysql> select * from my_table;
+------------------------------------+
| x                                  |
+------------------------------------+
| stackoverflow\.com\/questions\/ask |
+------------------------------------+

そして非対話的に:

mysql -uuser -Ddatabase -p'password' <<< "select * from my_table"
stackoverflow\\.com\\/questions\\/ask

--rawこのエスケープを無効にするために使用します。

mysql -uuser -Ddatabase -p'password' --raw <<< "select * from my_table"
stackoverflow\.com\/questions\/ask

マニュアルから:

--生、-r

表形式の出力の場合、列を囲む「ボックス化」により、ある列の値を別の列の値と区別できます。非表形式の出力(バッチモードで生成される場合や、-batchまたは--silentオプションが指定されている場合など)の場合、特殊文字は出力でエスケープされるため、簡単に識別できます。改行、タブ、NUL、および円記号は、\ n、\ t、\ 0、および\として記述されます。--rawオプションは、この文字のエスケープを無効にします。

ところで、mysql_real_escape_stringは使用するのに適切なエスケープ関数でした。

于 2011-09-02T18:26:26.327 に答える