LMLPHP后院

MySQL 非法混合字符集等号操作异常技术

maybe yes 发表于 2017-06-17 12:00

无意中使用搜索引擎快照的页面中的搜索框搜索,输入中文提交后台就有报错日志了,如下:

/search/%CF%C2%BB%AE%CF%DF/, exception 'LmlException' with message 'HY000
1267
Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='' in ...

报错原因是因为搜索引擎快照界面是 gb2312 编码,使用这样的编码难道是为了节约存储?

在网上找了很多资料,有人说使用 binary() 函数来解决报错,有人说修改数据库编码,让数据库的编码和 MySQL 的设置都保持一致。个人认为统一编码是不太好的做法,至少是不合适的,比如数据库个别表为了支持 emoji,使用的是 utf8mb4 编码,你总不能把所有的表都改成 utf8mb4 编码吧,这也太操蛋了。这些方法其实都是解决编码不一致,并且用户的行为是不能确定的,比如在自己的站内编码肯定是一致的,如果是用户模拟请求的话,就不是自己能控制的了的。

utf8 urlencode 转码没有问题,而 gb2312 urlencode 转码就出问题,如下:

%e4%b8%8b%e5%88%92%e7%ba%bf
%CF%C2%BB%AE%CF%DF

搞不懂为什么 MySQL 对编码的兼容能力这么弱,合理的结果应该是查找的数据为空,为什么会报错呢?。

难不成这种问题只能对用户的提交内容做一个编码转换?

LMLPHP,可爱滴WEB开发框架

2017-09-24 00:30:54 1506184254 0.005540