programing

MySql을 수정하는 방법: 인덱스 열 크기가 너무 큼(Laravel 마이그레이션)

mailnote 2023. 10. 8. 10:18
반응형

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

반응형