mysql illegal mix of_记一次解决mysql:Illegalmixofcollations报错原因

语言: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了

文章来源: www.oschina.net,作者:wantor,版权归原作者所有,如需转载,请联系作者。

原文链接:https://my.oschina.net/u/3659172/blog/3197525

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值