月度归档:2014年08月

Mysql INT和CHAR类型的隐式转换

最近碰到一个问题,由于没有对参数进行过滤和转换,直接拿到mysql里面进行查询了,大概是这样的:

select * from store where id='1}';
select * from store where id='{1}';#测试

但是前者仍然可以查出id为1的记录,后者是不行。知道mysql有隐式转换却不知道具体是怎么样的。google了下,发现隐式转换还有其他的问题,例如:

select * from store where name=0;
select * from store where name='0';

前者将会查询出所有的记录,而后者只会匹配name值为0的记录。
总结了一下大概是这些大概是以下的原因:

  • 当查询字段是INT类型,如果查询条件为CHAR,将查询条件转换为INT,如果是字符串前导都是数字将会进行截取,如果不是转换为0。
  • 当查询字段是CHAR类型,如果查询条件为INT,将查询字段为换为INT再进行比较,可能会造成全表扫描。示例2的name字段为CHAR类型,第一句查询转换为INT时都等于0,所以全部匹配了;第二句查询同为CHAR类型不发生转换,所以仅匹配值为0的记录。

mysql的隐式转换还有很多其他的坑,所以一定要指明查询条件类型,不要让mysql去做自动转换。

参考链接:
价值百万的 MySQL 的隐式类型转换
mysql字符串的隐式转换导致数据库操作异常
关于mysql 隐式转换的一个小问题
MySQL查询类型不正确不使用索引?
mysql的隐式的数据类型转换
MySQL隐式转换之坑
列类型

开启Firephp时Nginx PHP-FPM下502错误解决

在自己的电脑上调试的好好的,部署到Linux Nginx环境的时候却发现有些PHP页面在Firefox下面会返回502,在IE下面却是正常的,甚至在chrome下面也会出现502。顺着Nginx,Firefox这两个关键字,终于找到原因:原来是开启Firephp(chrome装了webug)时,Firephp的调试信息会写入的请求头里面,导致Nginx的FastCGI缓冲区超出,从而返回502。在自己的电脑上之所以不会是因为使用的是Apache。
于是顺着其他人的解答修改了nginx.conf中fastcig相关的参数:

fastcgi_buffer_size 1024k;
fastcgi_buffers 8 512k;
fastcgi_busy_buffers_size 1024k;
fastcgi_temp_file_write_size 1024k;

一开始这些参数是256,后来改成了512还是有部分页面会出现502,再改成1024终于好了。 继续阅读