[php] 라 라벨 마이그레이션 : 고유 한 키가 너무 길다

Laravel에서 users 테이블을 마이그레이션하려고합니다. 마이그레이션을 실행할 때이 오류가 발생합니다.

[Illuminate \ Database \ QueryException] SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1071 지정된 키가 너무 깁니다. 최대 키 길이는 767 바이트입니다 (SQL : alter table usersadd unique users_email_uniq ( email))

나의 이주는 다음과 같습니다 :

Schema::create('users', function(Blueprint $table)
{
    $table->increments('id');
    $table->string('name', 32);
    $table->string('username', 32);
    $table->string('email', 320);
    $table->string('password', 64);
    $table->string('role', 32);
    $table->string('confirmation_code');
    $table->boolean('confirmed')->default(true);
    $table->timestamps();

    $table->unique('email', 'users_email_uniq');
});

인터넷 검색 후 테일러가 인덱스 키를의 두 번째 매개 변수로 지정할 수 있다고 말하는 이 버그 보고서 를 보았습니다 unique(). 여전히 오류가 발생합니다. 무슨 일이야?



답변

이메일 길이를 더 짧게 지정하십시오.

$table->string('email', 250);

실제로 기본값은 다음과 같습니다.

$table->string('email');

그리고 당신은 잘해야합니다.

Laravel 5.4의 경우이 Laravel 5.4 : 지정된 키가 너무 긴 오류입니다. 에서 해결책을 찾을 수 있습니다 .

마이그레이션 가이드에 설명 된대로이 문제를 해결하려면 AppServiceProvider.php 파일을 편집하고 부팅 방법 내에서 기본 문자열 길이를 설정하면됩니다.

use Illuminate\Database\Schema\Builder;


public function boot()
{
    Builder::defaultStringLength(191);
}


답변

업데이트 1

현재 Laravel 5.4 이러한 변경은 필요 더 이상 없습니다.

Laravel 5.4는 기본적으로 utf8mb4 문자 세트를 사용하는데, 여기에는 데이터베이스에 “이모 지”를 저장하는 기능이 포함됩니다. Laravel 5.3에서 응용 프로그램을 업그레이드하는 경우이 문자 세트로 전환 할 필요가 없습니다.

업데이트 2

현재 프로덕션 MariaDB 버전 은 기본적으로이 설정을 전역 적으로 지원 하지 않습니다 . 기본적으로 MariaDB 10.2.2+ 에서 구현됩니다 .

해결책

당신이 의도적으로 올바른 미래 기본값을 사용하려는 경우와 UTF8 멀티 바이트 (5.4 Laravel부터) utf8mb4다음 데이터베이스 구성 😂 수정에 시작 😀에 대한 지원.

Laravel에서 config/database.php다음을 정의하십시오.

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',

DYNAMIC긴 키 인덱스 를 저장할 수 있습니다 .

서버 설정 (기본적으로 MySQL 5.7.7+ / MariaDB 10.2.2+에 포함됨) :

[mysqld]
# default character set and collation
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4

# utf8mb4 long key index
innodb_large_prefix = 1
innodb_file_format = barracuda
innodb_file_format_max = barracuda
innodb_file_per_table = 1

고객의 경우 :

[mysql]
default-character-set=utf8mb4

그런 다음 MySQL / MariaDB 서버 를 중지 하십시오. 그 후 START. 핫 RESTART가 작동하지 않을 수 있습니다.

sudo systemctl stop mysqld
sudo systemctl start mysqld

이제 UTF8을 지원하는 Laravel 5.x가 있습니다.


답변

Laravel 5.4를 사용 중이거나 업데이트 한 경우 이것은 저에게 효과적이었습니다.

한 번만 변경하십시오. AppServiceProvider.php에서

use Illuminate\Support\Facades\Schema;

public function boot()
{
  Schema::defaultStringLength(191);
}

마이그레이션 가이드 https://laravel.com/docs/master/migrations#creating-indexes에 언급 된대로


답변

다른 사람이 내가 한 것처럼이 답변을 우연히 발견 한 경우 다른 이유로 Laravel DB 문자 집합 / 데이터 정렬을 확인할 수 있습니다.

응용 프로그램 (Snipe-IT)을 설치하고 다음을 사용하도록 Laravel 데이터베이스 구성을 구성했습니다.

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',

mb4Antonio의 답변이 문제의 진정한 해결책이라고 생각하지만 두 문자열을 모두 제거 하면 문제가 해결되었습니다.


답변

이것은 나를 위해 일했다 :

 $table->charset = 'utf8';
 $table->collation = 'utf8_unicode_ci';


답변

config / database.php에서 charset 및 collation에서 mb4를 제거하면 성공적으로 실행됩니다.
‘charset’=> ‘utf8’,
‘collation’=> ‘utf8_unicode_ci’,


답변

laravel 5.6
이 솔루션은 내 문제를 해결
합니다. 아래 코드 찾기
로 이동 config/database.php
하십시오.

'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,
],

이 두 필드를 변경

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci'

이것으로

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci'