记一次解决mysqlIllegalmixofcollations报错原因

编程

语言:php

1.线下 预生产都ok,线上mysql报错;Illegal mix of collations (utf8mb4_unicode)(utf8_general)

初步原因: 有个城市名搜索,用的名字是临沂;我们测试一直用的 上海。参数是上海的话代码运作没问题

2.debug 打印sql,发现 城市参数 带进去生成的sql中 是乱码;

初步设想的是:mysql 比对时候根据连接字符集,字段的默认字符集做了转换导致;于是给字段修改指定的collation为uft8mb4;本地之前重现的错误不见了;

遂以为大功告成;

3.纠结于mysql几个collation的工作方式,查资料

4.发现 utf8mb4_unicode是代码连接数据库指定的collation;报错查询的表是utf8;想到为何同一个database别人建的表和此表类似,为何别人一直ok;于是找了个collation也是utf8的带字符串属性的字段 在代码中做中文查询验证, 没问题!是的,没问题,慌不慌,明明修好了都不报错了!

5.那打印的报错信息里面的sql的乱码参数怎么来的? 果然 是用 php 的trim 对 临沂/临沂市  入参整理 成 sql 条件 in (临沂, 临沂市),结果是乱码(二进制); C!

6.恍然意识到rtrim系列 是不支持多字节的;听说trim(上海市)没问题? 嗯哼,是的。 trim(临沂市 , 市)? 不行!

7.于是找替代函数,没现成的只有 mb_substr了;其他的,这个函数的length 参数试了下和 substr 一样支持负数,但是官方文档没提;就想之前某个函数不支持 负数一样,官方英文文档 都没提;

被自己坑了,差点放跑了一个大bug,还好好奇心接下来让我把它seize了

以上是 记一次解决mysqlIllegalmixofcollations报错原因 的全部内容, 来源链接: utcz.com/z/514498.html

回到顶部