programing

Laravel mysql 마이그레이션 오류

randomtip 2022. 9. 30. 09:14
반응형

Laravel mysql 마이그레이션 오류

최근에 mac book pro를 포맷하고 github에서 proyect를 복제하여 MySql 및 Sequel Pro와 같은 필요한 것을 설치한 후 데이터베이스 정보를 마이그레이션하려고 했는데 다음과 같은 오류가 나타납니다.

   Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER' (SQL: select * from information_schema.tables where table_schema = fisica and table_name = migrations)

  Exception trace:

  1   PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'")

버전:

Mysql 8.0.11

라라벨 5.6.12

PHP 7.1.14 (cli)

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=fisica
DB_USERNAME=xxx
DB_PASSWORD=xxx

Sequel PRO GUI에서 데이터베이스를 만들었습니다.

나는 마침내 얼마 전에 이 댓글을 기억한 해결책을 발견했다.에서config/database.php이 오류를 건너뛰려면 sql 모드를 추가해야 합니다.https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-full

MySQL 어레이는 다음과 같습니다.

    'mysql' => [
        'driver' => 'mysql',
        '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' => '',
        'strict' => true,
        'engine' => null,
        'modes'  => [
            'ONLY_FULL_GROUP_BY',
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_ENGINE_SUBSTITUTION',
        ],
    ],

파일:

설정/삭제php

'mysql' =[
    ...
    'strict' => false
]

또한 설정 sql_mode

를 통해 SQL:

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';

표제 안에 my.cnf을 통해[mysqld]

sql_mode=NO_ENGINE_SUBSTITUTION

변경을 테스트합니다.

SHOW VARIABLES LIKE 'sql_mode';

실제로코드를 mysql 드라이버와의 연결 끝에 추가해야 합니다.

'modes' => [
             'ONLY_FULL_GROUP_BY',
             'STRICT_TRANS_TABLES',
             'NO_ZERO_IN_DATE',
             'NO_ZERO_DATE',
             'ERROR_FOR_DIVISION_BY_ZERO',
             'NO_ENGINE_SUBSTITUTION',
         ],

이전에 MySQL 8에서 작동하던 Larabel을 5.3에서 5.7로 업그레이드한 후 문제가 없었고, 구글에서 검색한 결과 해결책을 찾을 수 없었습니다.나에게 효과가 있었던 것은 내 프로젝트 폴더를 검색하는 것이었다.

grep -rnw 'Location_to_your_project_folder' -e 'sql_mode'

그 결과

~/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php:183:return "set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'";

나는 먼저 제거NO_AUTO_CREATE_USER이 목록에서 모든 것 다시 일했다.

mysql 8.0 문서를 읽어보면 NO_AUTO_CREATE_USER가 sql 모드에서 삭제된 것 같습니다.사용하시는 my.cnf에서 이 정보가 참조되어 있을 것으로 생각됩니다.내부적으로는 conf 및 mysql 설정에서 삭제하고 mysqld를 재시작해야 합니다.

참고로 저는 mysql 8.0으로 업그레이드하지 않고 문서만 읽고 있습니다.5.6으로 만족합니다.

https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html

GRANT를 사용하여 사용자를 만듭니다.대신 CREATE USER를 사용합니다.이 절차를 따르면 GRANT 문에 NO_AUTO_CREATE_USER SQL 모드가 중요하지 않으므로 이 모드도 마찬가지입니다.

이 SQL 모드는 사용 중인 버전의 MYSQL에서 지원되지 않습니다.버전 8.0에서는 삭제되었습니다.이 SQL 모드를 지원하는 마지막 버전은 5.8이었습니다.MYSQL 버전은 8 이후일 수 있습니다.(Laravel도 업데이트해야 합니다)

혹은 당신의으로부터 삭제 작품 같다.config/database.php파일

mysql' => [
  ...
  'modes' => [
    ...
    //'NO_AUTO_CREATE_USER',
],

MySQL 8은 지원되지 않습니다.저도 같은 문제가 있어서 MySQL 버전(5.7)보다 낮은 버전을 사용해야 했습니다.

MySQL 8에서는 "sql_mode" 파라미터에서 "NO_AUTO_CREATE_USER" 옵션이 삭제되어 Laravel이 이를 찾고 있습니다.

내가 만난 같은 문제 오늘나는 오늘 같은문제에 직면했다와 함께 나왔다.mysql 8,,php 8,,laravel 8

솔루션

나는 방금 내방금 업데이트했습니다 업데이트된다.config/database파일을 파일 및 변경됨strict부터에서true로.false 절에서

    'mysql' => [
        ...
        'prefix_indexes' => true,
        'strict' => false,
        'engine' => null,
        ...
    ],

나한테는 효과가 있었어요

5.5 Larabel 5.5 "mysql 8.0.11"은 됩니다.NO_AUTO_CREATE_USER모드로부터 해방됩니다.저 에는 '', '다', '다', '다', '다', '다', '다'로 요.5.6.47.0. 에서는 . larabel 7의 이 추가되었습니다.config/database.php

'mysql' => [
    // ...
    'strict' => true,
    'version' => '8.0.11',
]

에서는 가장 쉬운 해결책은 7.x로 입니다.'strict' => false

조명/데이터베이스/커넥터/MySqlConnector.php

protected function strictMode(PDO $connection, $config)
{
    $version = $config['version'] ?? $connection->getAttribute(PDO::ATTR_SERVER_VERSION);

    if (version_compare($version, '8.0.11') >= 0) {
        return "set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'";
    }

    return "set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'";
}

문제는 Configuration의 데이터베이스 이름의 철자가 틀렸다는 것입니다.

언급URL : https://stackoverflow.com/questions/49949526/laravel-mysql-migrate-error

반응형