ข้อผิดพลาดในการย้ายข้อมูล Laravel: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1071 รหัสที่ระบุยาวเกินไป ความยาวสูงสุดของคีย์คือ 767 ไบต์


178

ข้อผิดพลาดในการย้ายข้อมูลใน Laravel 5.4 ด้วย php artisan make:auth

[Illuminate \ Database \ QueryException] SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1071 รหัสที่ระบุยาวเกินไป ความยาวของคีย์สูงสุดคือ 767 ไบต์ (SQL: แก้ไขอี tabl usersเพิ่มที่ไม่ซ้ำกันusers_email_unique( email))

[PDOException] SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1071 รหัสที่ระบุยาวเกินไป ความยาวสูงสุดของคีย์คือ 767 ไบต์


3
คุณควรตอบคำถามด้วยคำตอบ ไม่ได้อยู่ในคำถาม stackoverflow.com/help/self-answer
Can Vural

ขอบคุณสำหรับคำแนะนำ @ can-vural ฉันทำ
absiddiqueLive

คำตอบ:


283

ตามเอกสารอย่างเป็นทางการคุณสามารถแก้ปัญหานี้ได้ค่อนข้างง่าย

เพิ่มรหัสสองบรรทัดต่อไปนี้ลงในAppServiceProvider.php (/app/Providers/AppServiceProvider.php)

use Illuminate\Database\Schema\Builder; // Import Builder where defaultStringLength method is defined

function boot()
{
    Builder::defaultStringLength(191); // Update defaultStringLength
}

MySQL ขอสงวนจำนวนสูงสุดสำหรับฟิลด์ UTF8 ซึ่งเท่ากับ 4 ไบต์ดังนั้น 255 + 255 ด้วยชุดอักขระเริ่มต้นของคุณ utf8mb4 COLLATE utf8mb4_unicode_ci; คุณมีความยาวเกินขีด จำกัด สูงสุด 767 คีย์ โดย @scaisedge


3
ระวังเกี่ยวกับวิธีนี้ หากคุณสร้างดัชนีฟิลด์อีเมลอีเมลที่จัดเก็บจะมีความยาวสูงสุด 191 ตัวอักษรเท่านั้น สิ่งนี้น้อยกว่าสถานะ RFC อย่างเป็นทางการ
shock_gone_wild

1
วิธีแก้ปัญหานี้แนะนำโดย Laravel github.com/laravel/framework/issues/17508 laracasts.com/discuss/channels/laravel/ ......
absiddiqueLive

มันใช้งานได้และเป็นทางออกที่ถูกต้อง แต่ฉันแค่ต้องการชี้ให้เห็นว่ามีข้อผิดพลาดที่อาจเกิดขึ้นได้โดยใช้วิธีนี้
shock_gone_wild

ฉันหวังว่าโซลูชันนี้จะไม่มากัดฉันในตูดในอนาคต แต่สำหรับตอนนี้ใช้งานได้ ฉันจะต้องระมัดระวังด้วยว่าฉันทำดัชนีอีเมลอย่างไร
deusofnull

4
ทำไม 191 ตัวอักษร @absiddiqueLive
PseudoAj

121

ฉันไม่รู้ว่าทำไมการแก้ปัญหาข้างต้นและการแก้ปัญหาอย่างเป็นทางการซึ่งกำลังเพิ่ม

Schema::defaultStringLength(191);

ในAppServiceProviderไม่ทำงานสำหรับฉัน สิ่งที่ใช้ได้ผลก็คือการแก้ไขdatabase.phpไฟล์ในconfigโฟลเดอร์ เพียงแก้ไข

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

ถึง

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

และมันควรจะทำงานแม้ว่าคุณจะไม่สามารถเก็บอักขระ multibyte ขยายเช่นอีโมจิ

ฉันทำกับ Laravel 5.7 หวังว่ามันจะช่วย


5
การใช้ชุดอักขระนี้จะช่วยให้คุณบันทึก ASCII มาตรฐานเท่านั้นและไม่สามารถใช้อักขระพิเศษหลายไบต์เช่นจากอาหรับฮิบรูสคริปต์ยุโรปส่วนใหญ่และอีโมจิแน่นอน ดูเพิ่มเติมที่stackoverflow.com/a/15128103/4233593
Jeff Puckett

7
ฉันคิดว่าคุณพลาดส่วนนี้use Illuminate\Support\Facades\Schema;ที่ด้านบน
pimpace

@Koushik คุณกำลังใช้ Laravel รุ่นใดอยู่
pimpace

ตอนนี้ฉันอยู่ที่ 6.0 ฉันคิดว่าฉันทำตอนแรกด้วยอาจ 5.7 หรือ 5.6
Koushik Das

2
การutf8mb4เปรียบเทียบมีเหตุผลฉันแนะนำให้ใช้ถ้าคุณทำได้
เปลวไฟ

85

ฉันแค่เพิ่มคำตอบนี้ที่นี่เพราะมันเป็นquickestทางออกสำหรับฉัน เพียงแค่ตั้งค่าเอ็นจิ้นฐานข้อมูลเริ่มต้นเป็น'InnoDB'เปิด

/config/database.php

'mysql' => [
    ...,
    ...,
    'engine' => 'InnoDB',
 ]

จากนั้นรันphp artisan config:cacheเพื่อล้างและรีเฟรชแคชการกำหนดค่า


1
นี่ควรเป็นคำตอบ / คำตอบอย่างเป็นทางการสำหรับคำถามนี้ ... ขอบคุณ
Syamsoul Azrien

1
นี่คือวิธีการแก้ปัญหาที่เกิดขึ้นจริงคนอื่น ๆ มีวิธีแก้ปัญหา
Luís Cunha

3
แต่อะไรคือตรรกะที่อยู่เบื้องหลังสิ่งนี้
Zulfiqar Tariq

1
นั่นคือทางออกที่ถูกต้อง แต่ทำไมไม่รวมอยู่ในการติดตั้งเริ่มต้น
Ankit Chauhan

38

ในตัวAppServiceProvider.phpคุณรวมรหัสด้านบนของไฟล์

use Illuminate\Support\Facades\Schema;

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

ขอบคุณฉันช่วยออก
The Dead Man

24

ปัญหานี้เกิดขึ้นใน Laravel 5.4 โดยรุ่นฐานข้อมูล

ตามเอกสาร (ในIndex Lengths & MySQL / MariaDBส่วน):

Laravel ใช้utf8mb4ชุดอักขระตามค่าเริ่มต้นซึ่งรวมถึงการรองรับการจัดเก็บ "emojis" ในฐานข้อมูล หากคุณใช้ MySQL รุ่นเก่ากว่า 5.7.7 รีลีสหรือ MariaDB ที่เก่ากว่ารีลีส 10.2.2 คุณอาจต้องกำหนดค่าความยาวสตริงเริ่มต้นที่สร้างโดยการโอนย้ายด้วยตนเองเพื่อให้ MySQL สร้างดัชนีสำหรับพวกเขา คุณอาจกำหนดค่านี้โดยการเรียก วิธีการภายในของคุณSchema::defaultStringLengthAppServiceProvider

ในคำอื่น ๆ ใน<ROOT>/app/Providers/AppServiceProvider.php:

// Import Schema
use Illuminate\Support\Facades\Schema;
// ...

class AppServiceProvider extends ServiceProvider
{

public function boot()
{
    // Add the following line
    Schema::defaultStringLength(191);
}

// ...

}

แต่เป็นความคิดเห็นในคำตอบอื่น ๆ พูดว่า:

ระวังเกี่ยวกับวิธีนี้ หากคุณสร้างดัชนีฟิลด์อีเมลอีเมลที่จัดเก็บจะมีความยาวได้สูงสุด 191 ตัวอักษรเท่านั้น สิ่งนี้น้อยกว่าสถานะ RFC อย่างเป็นทางการ

ดังนั้นเอกสารยังเสนอวิธีแก้ปัญหาอื่น:

หรือคุณอาจเปิดใช้งานinnodb_large_prefixตัวเลือกสำหรับฐานข้อมูลของคุณ ดูเอกสารประกอบของฐานข้อมูลของคุณสำหรับคำแนะนำเกี่ยวกับวิธีการเปิดใช้งานตัวเลือกนี้อย่างถูกต้อง


16

AppServiceProvider.phpสำหรับคนที่ไม่ต้องการที่จะเปลี่ยนแปลง (ในความคิดของฉันมันเป็นความคิดที่ดีที่จะเปลี่ยนแปลงAppServiceProvider.phpเพียงเพื่อการโยกย้าย)

คุณสามารถเพิ่มความยาวข้อมูลกลับไปที่ไฟล์การโยกย้ายได้database/migrations/ดังนี้:

create_users_table.php

$table->string('name',64);
$table->string('email',128)->unique();

create_password_resets_table.php

$table->string('email',128)->index();

อาจเป็นปัญหาเนื่องจากอีเมลสามารถมีอักขระได้สูงสุด 255 ตัว (
ครึ่ง

คุณถูกต้อง @HalfCrazed แต่ฉันขอแนะนำคำตอบนี้stackoverflow.com/questions/1297272
helloroy

ปัญหาของฉันแก้ไขได้แน่นอนด้วยวิธีนี้ สาขาของฉันไม่ใช่อีเมล
Tharaka Devinda

11

หากคุณประสบข้อผิดพลาดนี้ขณะทำงานบน laravel ขณะใช้คำสั่ง: php artisan migrate คุณเพียงแค่เพิ่ม 2 บรรทัดในไฟล์: app-> Providers-> AppServiceProvider.php

  1. use Schema;
  2. Schema::defaultStringLength(191);

โปรดตรวจสอบภาพนี้ จากนั้นเรียกใช้php artisan migrateคำสั่งอีกครั้ง


1
มันสำคัญมากที่จะเพิ่ม 'use Schema;' ดังนั้นนี่คือคำตอบที่ดีที่สุด
hxwtch

คุณสามารถทำได้ในหนึ่งบรรทัดโดยเพิ่มเครื่องหมายสแลชย้อนหลัง '\' ก่อนหน้าบรรทัดที่ 2 เช่นนี้\Schema::defaultStringLength(191);
Tahir Afridi

10

ฉันกำลังเพิ่มสองลำพังงานที่สำหรับฉัน

วิธีแก้ปัญหาที่ 1 คือ :

  1. เปิดไฟล์database.php insde config dir / folder
  2. แก้ไข'engine' => null,เป็น'engine' => 'InnoDB',

    สิ่งนี้ใช้ได้สำหรับฉัน

วิธีแก้ปัญหาที่สองคือ:

  1. เปิดไฟล์database.php insde config dir / folder
    2. แก้ไข
    'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
    เป็น

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


โชคดี


10

อัปเดตและแทรกบรรทัดเหล่านี้ในแอป / ผู้ให้บริการ / AppServiceProvider.php

use Illuminate\Support\Facades\Schema;  // add this line at top of file

public function boot()
{
    Schema::defaultStringLength(191); // add this line in boot method
}

8

ฉันได้แก้ไขปัญหานี้แล้วและแก้ไขไฟล์ config-> database.php ของฉันให้เหมือนกับฐานข้อมูลของฉัน('charset' => 'utf8')และ the ('collation' => 'utf8_general_ci')ดังนั้นปัญหาของฉันจึงแก้ไขรหัสตาม ต่อไปนี้:

'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' => 'utf8',
        'collation' => 'utf8_general_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

8

ฉันพบวิธีแก้ไขปัญหาสองข้อสำหรับข้อผิดพลาดนี้แล้ว

ตัวเลือกที่ 1:

เปิดผู้ใช้และตารางpassword_resetของคุณในโฟลเดอร์ฐานข้อมูล / การย้ายข้อมูล

และเพียงแค่เปลี่ยนความยาวของอีเมล:

$table->string('email',191)->unique();

ตัวเลือก 2:

เปิดapp/Providers/AppServiceProvider.phpไฟล์ของคุณและภายในboot()วิธีการตั้งค่าความยาวสตริงเริ่มต้น:

use Illuminate\Support\Facades\Schema;

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

7

1-ไปที่/config/database.phpและค้นหาบรรทัดเหล่านี้

'mysql' => [
    ...,
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    ...,
    'engine' => null,
 ]

และเปลี่ยนเป็น:

'mysql' => [
    ...,
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    ...,
    'engine' => 'InnoDB',
 ]

2-เรียกใช้php artisan config:cacheเพื่อกำหนดค่า laravel ใหม่

3-ลบตารางที่มีอยู่ในฐานข้อมูลของคุณแล้วเรียกใช้php artisan migrateอีกครั้ง


1
นี่คือคำตอบที่ดีที่สุดสำหรับ laravel 5.8 แต่ลบตารางที่สร้างไว้แล้ว
Magige Daniel

แต่ตามเอกสาร "utf8" จะใช้โหมด utf8 ที่คัดค้านหรือไม่
NoBugs


5

แทนที่จะตั้งค่าขีดจำกัดความยาวฉันจะเสนอสิ่งต่อไปนี้ซึ่งใช้ได้กับฉัน

ภายใน:

config / database.php

แทนที่บรรทัดนี้สำหรับ mysql:

'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',

ด้วย:

'engine' => null,

4

ดังที่อธิบายไว้ในคำแนะนำในการย้ายข้อมูลเพื่อแก้ไขปัญหานี้สิ่งที่คุณต้องทำคือแก้ไขapp/Providers/AppServiceProvider.phpไฟล์ของคุณและภายในเมธอดการบูตตั้งค่าความยาวสตริงเริ่มต้น:

use Illuminate\Support\Facades\Schema;

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

หมายเหตุ: ก่อนอื่นคุณต้องลบ (ถ้าคุณมี) ตารางผู้ใช้ , password_resetsตารางจากฐานข้อมูลและลบผู้ใช้และรายการ password_resets จากตารางการย้ายข้อมูล

หากต้องการเรียกใช้การย้ายข้อมูลที่ค้างอยู่ทั้งหมดของคุณให้เรียกใช้งานmigrateคำสั่ง Artisan:

php artisan migrate

หลังจากนั้นทุกอย่างจะทำงานได้ตามปกติ


4

ตามที่ระบุไว้แล้วเราเพิ่มใน AppServiceProvider.php ในแอป / ผู้ให้บริการ

use Illuminate\Support\Facades\Schema;  // add this

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191); // also this line
}

คุณสามารถดูรายละเอียดเพิ่มเติมได้ในลิงค์ร้อง (ค้นหา "ดัชนีความยาวและ MySQL / MariaDB") https://laravel.com/docs/5.5/migrations

แต่นั่นไม่ใช่สิ่งที่ฉันตีพิมพ์เกี่ยวกับ! สิ่งที่เป็นแม้เมื่อทำข้างต้นคุณจะได้รับข้อผิดพลาดอื่น (นั่นคือเมื่อคุณเรียกใช้php artisan migrateคำสั่งและเนื่องจากปัญหาความยาวการดำเนินการจะติดอยู่ตรงกลางการแก้ปัญหาอยู่ด้านล่างและตารางผู้ใช้มีแนวโน้มที่จะสร้าง โดยไม่เหลือหรือไม่ได้ทั้งหมดอย่างถูกต้อง) เราต้องย้อนกลับ การย้อนกลับเริ่มต้นจะไม่ทำงาน เนื่องจากการดำเนินการโยกย้ายไม่ชอบเสร็จสิ้น คุณต้องลบตารางที่สร้างขึ้นใหม่ในฐานข้อมูลด้วยตนเอง

เราสามารถทำได้โดยใช้ทิงเกอร์ดังต่อไปนี้:

L:\todos> php artisan tinker

Psy Shell v0.8.15 (PHP 7.1.10  cli) by Justin Hileman

>>> Schema::drop('users')

=> null

ตัวฉันเองมีปัญหากับตารางผู้ใช้

หลังจากนั้นคุณก็พร้อมที่จะไป

php artisan migrate:rollback

php artisan migrate


4

วิธีแก้ปัญหาที่ไม่มีใครบอกคือในMysql v5.5และต่อมาInnoDBเป็นเครื่องมือจัดเก็บข้อมูลเริ่มต้นที่ไม่มีปัญหานี้ แต่ในหลาย ๆ กรณีเช่นของฉันมีไฟล์การตั้งค่า mysql ini เก่าซึ่งใช้เครื่องมือเก็บข้อมูลMYISAMเก่าเช่นด้านล่าง

default-storage-engine=MYISAM

ซึ่งกำลังสร้างปัญหาเหล่านี้ทั้งหมดและวิธีแก้ไขคือการเปลี่ยน default-storage-engine เป็นInnoDBในไฟล์การกำหนดค่าiniของ Mysql เพียงครั้งเดียวแทนที่จะทำแฮ็กชั่วคราว

default-storage-engine=InnoDB

และถ้าคุณอยู่บนMySql v5.5หรือใหม่กว่านั้นInnoDBเป็นเอ็นจิ้นเริ่มต้นดังนั้นคุณไม่จำเป็นต้องตั้งค่าอย่างชัดเจนเหมือนด้านบนเพียงแค่ลบdefault-storage-engine=MYISAMถ้ามันมีอยู่จากiniไฟล์ของคุณและคุณก็พร้อมที่จะไป


ขอบคุณ! ฉันต้องใช้คำแนะนำนี้ร่วมกับความยาวสตริง, ชุดอักขระและการเปลี่ยนแปลงการเรียงเพื่อให้สิ่งนี้สามารถทำงานกับ laravel 6 และ mysql 5.6 หวังว่านี่จะช่วยผู้อื่นในอนาคต
Casper Wilkes

@CasperWilkes คุณไม่ต้องดำเนินการใด ๆ กับความยาวสตริงนั้น ตรวจสอบตัวแปรระบบ Mysql ของคุณเช่นนี้show global variables like 'innodb_large_prefix';มันควรจะเป็นON ถ้ามันปิดอยู่คุณสามารถตรวจสอบคำตอบนี้ได้ว่าจะเปิด และนี่คือข้อมูลเพิ่มเติมเกี่ยวกับ innodb_large_prefix บน dev.mysql.com
Ali A. Dhillon

3

หากคุณต้องการเปลี่ยนใน AppServiceProvider คุณต้องกำหนดความยาวของฟิลด์อีเมลในการย้ายข้อมูล เพียงแค่แทนที่รหัสบรรทัดแรกเป็นบรรทัดที่สอง

create_users_table

$table->string('email')->unique();
$table->string('email', 50)->unique();

create_password_resets_table

$table->string('email')->index();
$table->string('email', 50)->index();

หลังจากการเปลี่ยนแปลงสำเร็จคุณสามารถเรียกใช้การย้ายข้อมูลได้
หมายเหตุ: ก่อนอื่นคุณต้องลบ (ถ้าคุณมี) ตารางผู้ใช้ , password_resets ตารางจากฐานข้อมูลและลบผู้ใช้และรายการ password_resets จากตารางการโยกย้าย


3

Schema::defaultStringLength(191);จะกำหนดความยาวของสตริงทั้งหมด 191 ตามค่าเริ่มต้นซึ่งอาจทำลายฐานข้อมูลของคุณ คุณต้องไม่ไปทางนี้

เพียงกำหนดความยาวของคอลัมน์ใด ๆ ในคลาสการย้ายฐานข้อมูล ตัวอย่างเช่นฉันกำหนด "ชื่อ", "ชื่อผู้ใช้" และ "อีเมล" ในCreateUsersTableชั้นเรียนดังต่อไปนี้:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 191);
            $table->string('username', 30)->unique();
            $table->string('email', 191)->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

1
นี่เป็นวิธีที่ดีที่สุดสำหรับฉันเพราะฉันไม่ต้องการปรับแต่งรหัสหลักของ Laravel
Okiemute Omuta

2

นี่เป็นเรื่องปกติเนื่องจาก Laravel 5.4 ได้เปลี่ยน charater ฐานข้อมูลเริ่มต้นเป็น utf8mb4 สิ่งที่คุณต้องทำคือแก้ไข App \ Providers.php ของคุณโดยใส่รหัสนี้ก่อนการประกาศคลาส

use Illuminate\Support\Facades\Schema;

นอกจากนี้ให้เพิ่มสิ่งนี้ในฟังก์ชั่น 'boot' Schema::defaultStringLength(191);


2

หากคุณไม่มีข้อมูลใด ๆ ที่กำหนดให้กับฐานข้อมูลของคุณแล้วให้ทำดังต่อไปนี้:

  1. ไปที่แอพ / ผู้ให้บริการ / AppServiceProvide.php และเพิ่ม

ใช้ Illuminate \ Support \ ServiceProvider;

และด้านในของวิธีการบูต ();

Schema :: defaultStringLength (191);

  1. ตอนนี้ลบระเบียนในฐานข้อมูลของคุณตารางผู้ใช้เช่น

  2. เรียกใช้ต่อไปนี้

PHP ช่างตั้งค่า: แคช

PHP ช่างโยกย้าย


มันใช้งานได้ แต่จำเป็นต้องเพิ่ม use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider;มีอยู่แล้ว หวังว่าคุณจะแก้ไขมัน
Jimish Gamit

2

ดังที่อธิบายไว้ในคำแนะนำในการย้ายข้อมูลเพื่อแก้ไขสิ่งที่คุณต้องทำคือแก้ไขไฟล์ AppServiceProvider.php และภายในวิธีการบูตให้ตั้งค่าความยาวสตริงเริ่มต้น:

//edit your AppServiceProvider.php file contains in providers folder
use Illuminate\Support\Facades\Schema;

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

หวังว่านี่จะช่วยคุณได้


2

ฉันเพิ่งแก้ไขบรรทัดต่อไปนี้usersและpassword_resetsไฟล์การโยกย้าย

เก่า: $table->string('email')->unique();

ใหม่: $table->string('email', 128)->unique();


1

เพื่อหลีกเลี่ยงการเปลี่ยนแปลงอะไรในรหัสของคุณเพียงแค่อัปเดตเซิร์ฟเวอร์ MySQL ของคุณเป็นอย่างน้อย 5.7.7

อ้างอิงสิ่งนี้สำหรับข้อมูลเพิ่มเติม: https://laravel-news.com/laravel-5-4-key-too-long-error


Nope the Mariadb 10.1.41 ใน 18.04 ยังมีข้อผิดพลาดนี้
NoBugs

1

ฉันคิดว่าการบังคับให้ StringLenght ถึง 191 เป็นความคิดที่ไม่ดีจริงๆ ดังนั้นฉันจึงตรวจสอบเพื่อทำความเข้าใจว่าเกิดอะไรขึ้น

ฉันสังเกตเห็นว่าข้อความผิดพลาดนี้:

SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1071 รหัสที่ระบุยาวเกินไป ความยาวสูงสุดของคีย์คือ 767 ไบต์

เริ่มแสดงหลังจากที่ฉันอัพเดตเวอร์ชัน MySQL ของฉัน ดังนั้นฉันจึงตรวจสอบตารางด้วย PHPMyAdmin และฉันสังเกตเห็นว่าตารางใหม่ที่สร้างขึ้นนั้นมาพร้อมกับการจัดเรียงutf8mb4_unicode_ciแทนที่จะเป็นutf8_unicode_ciสำหรับเก่า

ในไฟล์ config หลักคำสอนของฉันฉันสังเกตว่าชุดอักขระถูกตั้งค่าเป็น utf8mb4 แต่ตารางก่อนหน้าทั้งหมดของฉันถูกสร้างใน utf8 ดังนั้นฉันคิดว่านี่เป็นเวทย์มนตร์อัปเดตที่เริ่มใช้งาน utf8mb4

ตอนนี้การแก้ไขที่ง่ายคือการเปลี่ยน line charset ในไฟล์ ORM config ของคุณ จากนั้นให้วางตารางโดยใช้ utf8mb4_unicode_ci หากคุณอยู่ในโหมด dev หรือแก้ไขชุดอักขระหากคุณไม่สามารถวางได้

สำหรับ Symfony 4

เปลี่ยนcharset: utf8mb4เป็นcharset: utf8ในconfig / packages / doctrine.yaml

ตอนนี้การย้ายหลักคำสอนของฉันกำลังทำงานอีกครั้งได้ดี


1

ทางออกที่แนะนำคือการเปิดใช้งานinnodb_large_prefixตัวเลือกของ MySQL ดังนั้นคุณจะไม่ได้รับปัญหาที่ตามมา และนี่คือวิธีทำ:

เปิดmy.iniไฟล์การกำหนดค่า MySQL และเพิ่มบรรทัดด้านล่างภายใต้[mysqld]บรรทัดเช่นนี้

[mysqld]
innodb_file_format = Barracuda
innodb_large_prefix = 1
innodb_file_per_table = ON

หลังจากนั้นให้บันทึกการเปลี่ยนแปลงและเริ่มบริการ MySQL ใหม่

ย้อนกลับถ้าคุณต้องการแล้วเรียกใช้การโยกย้ายอีกครั้ง


ในกรณีที่ปัญหาของคุณยังคงอยู่ให้ไปที่ไฟล์กำหนดค่าฐานข้อมูลและตั้งค่า

'engine' => null, ถึง 'engine' => 'innodb row_format=dynamic'

หวังว่ามันจะช่วย!


1

ก่อนลบตารางทั้งหมดของฐานข้อมูลใน localhost

เปลี่ยนคุณสมบัติฐานข้อมูลเริ่มต้น Laravel (utf8mb4) ในไฟล์ config / database.php เป็น:

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

หลังจากนั้นเปลี่ยนคุณสมบัติฐานข้อมูลท้องถิ่นของฉัน utf8_unicode_ci PHP ช่างโยกย้ายมันก็โอเค


0

สำหรับคนอื่นที่อาจพบปัญหานี้ปัญหาของฉันคือฉันกำลังสร้างคอลัมน์ประเภทหนึ่งstringและพยายามทำ->unsigned()เมื่อฉันหมายความว่ามันจะเป็นจำนวนเต็ม


0

วิธีการทำงานที่นี่ได้ผ่านพารามิเตอร์ที่สองโดยใช้ชื่อคีย์ (ตัวย่อ):

$table->string('my_field_name')->unique(null,'key_name');

0

ฉันได้รับข้อผิดพลาดนี้ถึงแม้ว่าฉันมีอยู่แล้ว (จริง ๆ แล้วเพราะฉันมีอยู่แล้ว) Schema :: defaultStringLength (191); ในไฟล์ AppServiceProvider.php ของฉัน

สาเหตุคือเนื่องจากฉันพยายามตั้งค่าสตริงในการย้ายข้อมูลของฉันเป็นค่าที่สูงกว่า 191:

Schema::create('order_items', function (Blueprint $table) {
    $table->primary(['order_id', 'product_id', 'attributes']);
    $table->unsignedBigInteger('order_id');
    $table->unsignedBigInteger('product_id');
    $table->string('attributes', 1000); // This line right here
    $table->timestamps();
});

การลบ 1,000 หรือตั้งเป็น 191 แก้ไขปัญหาของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.