MySql을 수정하는 방법: 인덱스 열 크기가 너무 큼(Laravel 마이그레이션)
Debian, Nginx, PhpMyAdmin, ...을 설치하는 부랑자 상자와 프로젝트를 복제했습니다.tphp artisan migrate합니다.
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1709 Index column size too large. The maximum column size is 767 bytes. (SQL: alter table `courses` add unique `courses_name_unique`(`na
me`))
작업 프로젝트 데이터베이스의 덤프(구조 + 데이터)를 만들어 데이터베이스에 가져오면 마이그레이션 시 오류가 발생하면 모든 것이 정상이고 모든 테이블과 데이터를 가져옵니다.
마이그레이션 방법을 실행할 수 있도록 크기를 수정하려면 어떻게 해야 합니까?
인덱스를 생성하려면 "최대 컬럼 크기는 767바이트입니다."라는 오류 메시지에서 볼 수 있듯이,VARCHAR(255)대 765(255*3)다를 할 수 .utf81020(255*4)바이트를 사용합니다.utf8mb4에서 MySQL을utf8,대 3까지 소요됩니다.utf8mb4최대 4바이트(실제 UTF8).따라서 다음과 같이 만듭니다.VARCHAR(255)와 e)eutf8mb4실패할 것입니다
문제를 해결할 수 있는 옵션은 다음과 같습니다.
에서의 기본 my.ini:
collation_server=utf8_unicode_ci
character_set_server=utf8
다음을 작성할 때 데이터베이스에 대한 기본 데이터 정렬을 설정합니다.
CREATE DATABASE IF NOT EXISTS `your_db` COLLATE 'utf8_unicode_ci'
테이블/열에 기본 조합을 설정합니다. (권장하지 않습니다.)
를 190 으로합니다()varchar(190)이하.
라라벨 5.4 수정
Laravel의 migration 명령으로 Mysql 서버 구성을 덮어씁니다.조합과 문자 집합을 구성 버전으로 설정합니다.
를 변경합니다.charset그리고.collation는 db에 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', ''),
//'charset' => 'utf8mb4',
//'collation' => 'utf8mb4_unicode_ci',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
..
의를 *my.cnf다음 일,
innodb_default_row_format=dynamic
innodb_file_format=barracuda
innodb_file_per_table=true
innodb_large_prefix=true
를 시작해야 .mariadb업데이트된 구성을 적용하기 위한 서비스입니다.
각각 단점이 있는 세 가지 해결책:
MySQL 5.7은 문제를 방지합니다.업그레이드를 고려해 보십시오.
VARCHAR(255)일반적으로 필요 이상의 크기입니다.191 이하로 안전하게 축소할 수 있다면 오류는 사라질 것입니다.중국어나 이모지가 필요 없는 경우 utf8(utf8mb4에서)로 전환합니다.
2가지 추가 옵션: http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes
Laravel 5.5 이상의 경우 구성/데이터베이스에서 변경합니다.엔진을 InnoDB ROW_FORMAT=Dynamic으로 php 파일:
'connections' => [
...
'mysql' => [
...
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
]]
라라캐스트 덕분에: https://laracasts.com/discuss/channels/eloquent/migrations-and-table-options-row-format
App\Providers\AppServiceProvider.php,Schema다음 항목 포함:
use Illuminate\Support\Facades\Schema;
그리고.boot()function add this line:
Schema::defaultStringLength(191);
기본적으로 MySQL은 문자 집합 utf8을 사용하는데, 이는 1개의 문자마다 3바이트를 사용한다는 것을 의미합니다.즉, varchar(10)의 열 유형은 30바이트를 사용하여 압축 행 형식의 최대 접두사 크기가 varchar(255)와 같음을 의미합니다.즉, 255 * 3 bytes = 765바이트로 최대치인 767바이트보다 2바이트 적습니다.
innodb_large_prefix를 on으로 설정하고 행 형식 COMPRESSED 또는 Dynamic을 사용하면 최대 접두사 문자 크기를 767바이트가 아닌 65536바이트로 늘릴 수 있습니다.아래 차트는 InnoDB large prefix 및 [COMPRESSED | Dynamic] 행 형식의 최대 문자 길이를 보여줍니다.utf8mb4에 대한 이러한 값은 테이블의 최대 행 크기보다 높으므로 이러한 한계에 도달할 방법이 없습니다.
자세한 내용은 여기 https://discuss.pivotal.io/hc/en-us/articles/115004086747-Apps-are-down-due-to-the-Maximum-Column-Size-is-767-bytes-Constraint-in-MySQL
또한 제가 방금 한 일이 db 연결 스크립트에서 utf8mb4_unicode_ci에서 utf8_unicode_ci로 되돌리는 문제가 있었습니다.
5.5.52-MariaDB와 함께 작동합니다.
모든 인코딩을 (서버, 데이터베이스, 연결)로 설정합니다.
언급URL : https://stackoverflow.com/questions/42043205/how-to-fix-mysql-index-column-size-too-large-laravel-migrate
'programing' 카테고리의 다른 글
| HTML 스크립트 태그: 유형 또는 언어(또는 둘 다 생략)? (0) | 2023.10.08 |
|---|---|
| 디버그 모드에서 플라스크가 두 번 초기화하는 것을 막는 방법? (0) | 2023.10.08 |
| mysql에 음수 값 저장 (0) | 2023.10.08 |
| jquery-ui 날짜 선택기 변경 z-index (0) | 2023.10.08 |
| PowerShell 5.1 - 현재 사용 중인 모듈을 제거하는 방법 (0) | 2023.10.08 |