我有一系列正则表达式,包括我需要存储在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
关于我做错了什么的想法?
答案 0 :(得分:7)
斜杠在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
从手册:
- raw,-r
对于表格输出,列周围的“装箱”可以将一个列值与另一个列值区分开来。对于非表格输出(例如以批处理模式或在给出--batch或--silent选项时生成),特殊字符将在输出中转义,以便可以轻松识别它们。换行符,制表符,NUL和反斜杠写为\ n,\ t,\ 0和\。 - raw 选项禁用此字符转义。
BTW mysql_real_escape_string是正确使用的转义函数。