ORM 查询编码报错,(gbk_chinese_ci,IMPLICIT) and (utf8...[自己搞定]

>>> \App\Ip::where('zt', '未付')-> get();
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (utf8_unicode_ci,COERCIBLE) for operation '=' (S
QL: select * from `ip` where `zt` = 未付)'
>>>

这个数据库是GBK编码,但是不能修改成UTF8的。
用tinker测试报错了,求解决方法,谢谢!

ORM 查询编码报错,(gbk_chinese_ci,IMPLICIT) and (utf8...【自己搞定】

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

搞定!被我自己给搞定了,方法贴出了,供大家免费参考!暴力方法,直接写SQL查询语句……不够优雅,求改进的写法。

\App\Ip::query('select convert(zt USING gbk) from ip where zt = "未付"')->limit(2)->get()

Laravel
稍微改进了一下,去掉多余的表名,去掉多余的双引号,测试OK

>>> \App\Ip::query('select convert(zt USING gbk) where zt = 未付')->limit(2)->get()

Laravel

4年前 评论
zhaiduting (作者) (楼主) 4年前
zhaiduting (作者) (楼主) 4年前
讨论数量: 7

\App\Ip::where('zt', 'CONVERT("未付" USING gbk_chinese_ci)')-> get();
这样也不行

4年前 评论
lochpure

Laravel默认的数据库编码是utf8mb4,你可以在配置文件中修改它。另外建议数据库中使用数字代替查询的汉字,比如1代表未支付,2代表已支付。

4年前 评论
zhaiduting (楼主) 4年前

找到办法了,下面这么干是可以的!问题是怎么用ORM来写这个查询呢?

select convert(zt USING gbk) from `ip` where zt = "未付"

求帮忙,谢谢

4年前 评论
        'mysql' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => env('DB_DATABASE', 'forge'),
            'username'  => env('DB_USERNAME', 'forge'),
            'password'  => env('DB_PASSWORD', ''),
            'charset'   => 'gbk',
            'collation' => 'gbk_chinese_ci',
            'prefix'    => '',
            'strict'    => false,
        ],

修改成 gbk 了,但是又报错了,错误如下

>>> \App\Ip::where('zt', '未付')-> get();
ErrorException with message 'json_encode(): Invalid UTF-8 sequence in argument'
>>>
4年前 评论

搞定!被我自己给搞定了,方法贴出了,供大家免费参考!暴力方法,直接写SQL查询语句……不够优雅,求改进的写法。

\App\Ip::query('select convert(zt USING gbk) from ip where zt = "未付"')->limit(2)->get()

Laravel
稍微改进了一下,去掉多余的表名,去掉多余的双引号,测试OK

>>> \App\Ip::query('select convert(zt USING gbk) where zt = 未付')->limit(2)->get()

Laravel

4年前 评论
zhaiduting (作者) (楼主) 4年前
zhaiduting (作者) (楼主) 4年前

一问接一问,把字段 zt 更新为已付款怎么写呢?这次convert(zt USING gbk)貌似不行了

4年前 评论
zhaiduting (作者) (楼主) 4年前

更新订单状态的代码还是比较优雅的,就是多调用一个 iconv() 函数而已。注意参数顺序,gbk在前,utf8在后

\App\Ip::where('ddh2', '$5a938f8727_201911281036510775')->update([
    'zt'=> iconv('GBK', 'UTF-8', '已付'),
    ...
]);

file

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!