Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何修复Laravel非法混合排序规则错误?_Php_Mysql_Database_Laravel_Collation - Fatal编程技术网

Php 如何修复Laravel非法混合排序规则错误?

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的非法

我有一个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私人有限公司

这是我的数据库配置

        '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确实解决了这一问题。