Laravel에서 users 테이블을 마이그레이션하려고합니다. 마이그레이션을 실행할 때이 오류가 발생합니다.
[Illuminate \ Database \ QueryException] SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1071 지정된 키가 너무 깁니다. 최대 키 길이는 767 바이트입니다 (SQL : alter table
users
add unique users_email_uniq (
나의 이주는 다음과 같습니다 :
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',
mb4
Antonio의 답변이 문제의 진정한 해결책이라고 생각하지만 두 문자열을 모두 제거 하면 문제가 해결되었습니다.
답변
이것은 나를 위해 일했다 :
$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'