空间访问权限:游客, 头像访问权限:自己
[登录]后可以浏览更多信息
博客正文
【操作】
转义符\与php、mysql的处理效率

我们知道addslashes可以为' " \加上转义符,以使得数据能正确存入数据库,那么转义符的介入会不会增加php程序和mysql的开销呢,本人今天做了如下实验。

一、实验1,不作任何处理直接入库

<form name="fmrufile" action="___.php">
    <input type="text" name="k" value=""/>
    <button type="submit">Submit</button>
</form>
<?php
    $k = isset($_POST['k']) ? $_POST['k'] : "";

    $sql = "INSERT `test`(`memo`) VALUES('{$k}')";
    mysql_query($sql) or die(mysql_error());
?>
执行以上代码,输入'和\都会导致数据存储错误,而输入"是可以正确保存数据的,也就是说双引号是不需要转义也能存入数据库的,为了正确处理用户提交的数据,稍作改进,得到以下代码:

<?php
    $k = isset($_POST['k']) ? $_POST['k'] : "";

    $k = addslashes($k);
    $sql = "INSERT `test`(`memo`) VALUES('{$k}')";
    explodeStr($sql);
    mysql_query($sql) or die(mysql_error());

    function explodeStr($str){
          echo "{$str}<br/>\n";;
          for($i=0;$i<strlen($str);$i++){
                  echo  $str[$i] . " => " . ord($str[$i]) . "<br/>\n";
         }
     echo "<br/>\n";
}
?>

     执行以上代码,输入' \ 和 "都不会导致数据存储错误。但由于有addslashes的" 已经被转义为\"了,但执行结果却和实验1相同,即:
INSERT `test`(`memo`) VALUES('"')
INSERT `test`(`memo`) VALUES('\"')
执行效果相同,本人遂猜想这样个处理机制一定来源于mysql而不是php,于是到mysql命令行下做了个实验:
mysql> INSERT INTO `test`(`memo`) VALUES ('\"')\G
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `test`(`memo`) VALUES ('"')\G
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `test`(`memo`) VALUES ('\\"')\G
Query OK, 1 row affected (0.00 sec)

snap1.jpg
实验结果为前2句插入的都是",最后一句插入的是\",证明自己的猜想完全正确,也就是说php对双引号的转义在mysql存储时毫无鸟用。转义和不转义都会被mysql智能处理掉.

二、实验2,PHP里,用addslashed、str_replace、preg_replace 添加转义符的效率

既然"并不需要转义成\"就能存储到数据库,那用str_replace替代addslashes好吗,还有preg_replace批量替换呢?于是做了如下效率测试实验。

snap2.jpg


运行结果如下:

snap4.jpg

从运行结果得出,addslashes速度和单独一次str_replace差不多快,三次str_replace消耗的时间基本就是addslashes的时间。而正则批量替换的速度是最慢的。值得一提的是,在这里php语法检测还出现了一个bug,灰色部分的代码无法执行。

三、mysql处理转义符的机制和效率

从实验一得知:

INSERT INTO `test`(`memo`) VALUES ('\"')
INSERT INTO `test`(`memo`) VALUES ('"')

是等效的,但有转义符的\"一定会被mysql移除转义符再存入数据库,那么前者的执行效率将偏低,做了如下实验验证了本人的想法:

00.jpg
运行结果如下,证明了添加转义符的"确实需要消耗资源:

snap1.jpg

 

现在让所有的字符串都是\"或者" 再做一次对比实验

11.jpg
运行结果如下:

snap2.jpg

这充分证明了mysql在入库时去掉转义符的开销其实并不低。


 

栏目划分
WEB应用程序 (21)
桌面应用程序 (4)
Windows操作系统 (8)
xNix操作系统 (3)
数据库技术 (3)
多媒体技术 (0)
硬件技术 (2)
办公软件 (1)
以史为鉴 (2)
万博官网manbetx苹果版反思1 (1)
奇闻趣事 (5)
其它 (9)
万博官网manbetx苹果版反思 (3)
电子技术 (2)
中学生科技 (3)
 
主人推荐
音象定位和音箱喇叭的排步
我国高层意向已定:制造大飞机
“运十”悲剧
日尔曼人
细说百越族
宇宙深处的秘密——星云
[强烈推荐]中华56民族FLASH完整珍藏版
一组漂亮的植物