Php 如何修复Laravel非法混合排序规则错误?
我有一个cronjob,它通过调用API来保存数据。这以前从未发生过,我已经将排序规则更改为latin1_swedish_ci,隐式和utf8mb4_unicode_ci,可强制,反之亦然,以便测试。但我还是犯了这样的错误。奇怪的是,当我检查数据库时,我可以插入一半数据,在插入的中间出现错误。 Illumb\Database\QueryException:SQLSTATE[HY000]:一般错误:1267排序规则latin1_swedish_ci、隐式和utf8mb4_unicode_ci的非法混合,可强制执行操作“=”SQL:从“刮取”中选择count*作为聚合。xp_ecoprop_projectlist`其中'projectId`=9a8d5bceacb54a78a18052f1a8ef2112和'projectName`=Ki在布鲁克维尔的住宅翠宁苑 和'country`=新加坡,'location`=D21-Clementi/Upper Bukit Timah和'Property Group`=D09、D10、D11,D21和“纬度”=新加坡和“经度”=新加坡和“单位长度”=660和“启动日期”=1605888000000和“启动日期文本”=2020年第四季度和“主图像”=https://img.singmap.com/upload/broke/da3d9f7796fb41409a7febecd684da42/9a8d5bceacb54a78a18052f1a8ef2112/imgs/9674a2c02a08404b9ca533a9d532b64a.jpg 和“最低价格”=0和“最高价格”=0和'streetAddress`=2-22 Brookvale Dr和'Renecure`=999年和'developer`=Hai Hup Sunway Clementi私人有限公司 这是我的数据库配置Php 如何修复Laravel非法混合排序规则错误?,php,mysql,database,laravel,collation,Php,Mysql,Database,Laravel,Collation,我有一个cronjob,它通过调用API来保存数据。这以前从未发生过,我已经将排序规则更改为latin1_swedish_ci,隐式和utf8mb4_unicode_ci,可强制,反之亦然,以便测试。但我还是犯了这样的错误。奇怪的是,当我检查数据库时,我可以插入一半数据,在插入的中间出现错误。 Illumb\Database\QueryException:SQLSTATE[HY000]:一般错误:1267排序规则latin1_swedish_ci、隐式和utf8mb4_unicode_ci的非法
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
您正在使用MySQL 8.0.22吗?如果是这样,这是一个已知的bug,其修复程序将在8.0.23中发布: 你可以: 降级到MySQL 8.0.21 在建立数据库连接时,在选项中将PDO::ATTR_EMULATE_设置为true *请谨慎使用此代码,因为它可能会破坏与当前代码的兼容性。当PDO::ATTR_EMULATE_PREPARES为true时,从MySQL数据库获取的记录不会自动转换,因此所有整数都将作为字符串获取。当您使用===运算符进行比较时,这将破坏兼容性。 要解决此问题,您可以自己在所有模型中手动强制转换属性 **说明:PDO::ATTR_EMULATE_PREPARES在建立PDO连接时默认为true,Laravel将该选项设置为false。当PDO::ATTR_EMULATE_PREPARES为false时,所有SQL语句都是在MySQL服务器上准备的,而不是在PHP级别上准备的,因此该错误发生在MySQL 8.0.22上 将所有列的排序规则更改为与设置utf8mb4\u unicode\u ci中设置的排序规则相同
您正在使用MySQL 8.0.22吗?如果是这样,这是一个已知的bug,其修复程序将在8.0.23中发布: 你可以: 降级到MySQL 8.0.21 在建立数据库连接时,在选项中将PDO::ATTR_EMULATE_设置为true *请谨慎使用此代码,因为它可能会破坏与当前代码的兼容性。当PDO::ATTR_EMULATE_PREPARES为true时,从MySQL数据库获取的记录不会自动转换,因此所有整数都将作为字符串获取。当您使用===运算符进行比较时,这将破坏兼容性。 要解决此问题,您可以自己在所有模型中手动强制转换属性 **说明:PDO::ATTR_EMULATE_PREPARES在建立PDO连接时默认为true,Laravel将该选项设置为false。当PDO::ATTR_EMULATE_PREPARES为false时,所有SQL语句都是在MySQL服务器上准备的,而不是在PHP级别上准备的,因此该错误发生在MySQL 8.0.22上 将所有列的排序规则更改为与设置utf8mb4\u unicode\u ci中设置的排序规则相同
可能重复此已应答线程检查。可能重复此已应答线程检查。我使用5.7.22-log。对于OP,我仍然会尝试这些修复,即使是对于5.7,因为该版本中也可能存在错误。升级到8.0.23确实修复了此问题。我使用5.7.22-log。对于OP,我仍然会尝试这些修复,即使是5.7版本,因为该版本中也可能存在缺陷。升级到8.0.23确实解决了这一问题。