การย้าย Laravel: รหัสเฉพาะยาวเกินไปแม้ว่าจะระบุไว้


166

ฉันกำลังพยายามโยกย้ายตารางผู้ใช้ใน Laravel เมื่อฉันทำการโยกย้ายฉันได้รับข้อผิดพลาดนี้:

[Illuminate \ Database \ QueryException] SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1071 รหัสที่ระบุยาวเกินไป ความยาวสูงสุดของคีย์คือ 767 ไบต์ (SQL: แก้ไขตารางusersเพิ่ม 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');
});

หลังจาก googling ฉันพบรายงานข้อผิดพลาดนี้ที่ Taylor บอกว่าคุณสามารถระบุคีย์ดัชนีเป็นพารามิเตอร์ที่ 2 ของunique()ที่ฉันได้ทำ มันยังคงให้ข้อผิดพลาด เกิดขึ้นที่นี่คืออะไร?


ทำไมคุณใช้ 320 chars สำหรับอีเมล นี่อาจเป็นปัญหาของคุณ
Antonio Carlos Ribeiro

1
นั่นเป็นปัญหาอย่างแท้จริง แต่ใช่คุณพูดถูกฉันไม่รู้ว่าทำไมฉันถึงระบุความยาวถ่านสำหรับแต่ละฟิลด์ ได้ลบข้อ จำกัด เหล่านี้แล้ว
harryg

มันตลกดีที่ไม่มีใครแนะนำให้ใช้ฟิลด์ความยาวคงที่ที่มีแฮชของอีเมลและข้อความเสียง - แก้ไขปัญหาได้ตลอดไปสำหรับกรอบงานและฐานข้อมูลเชิงสัมพันธ์ เพราะนั่นคือวิธีที่เรารับประกันความเป็นเอกลักษณ์ - ใช้การแสดงตัวเลขคงที่ของอินพุตความยาวผันแปรเนื่องจากความจริงที่ว่าช่วงตัวเลขนั้นมีขนาดใหญ่พอสมควร (และสำหรับ sha1 / sha256 คือ)
NB

1
laravel-news.com/laravel-5-4-key-too-long-errorอาจได้รับความช่วยเหลือ
matinict

คำตอบ:


280

ระบุความยาวที่น้อยกว่าสำหรับอีเมลของคุณ:

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

ซึ่งเป็นค่าเริ่มต้นจริง ๆ แล้ว:

$table->string('email');

และคุณควรจะดี

สำหรับ Laravel 5.4 คุณสามารถหาวิธีแก้ปัญหาในLaravel 5.4นี้: คีย์ที่ระบุมีข้อผิดพลาดยาวเกินไปโพสต์ข่าว Laravel :

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

use Illuminate\Database\Schema\Builder;


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

6
ความยาวอีเมลสูงสุดที่เป็นไปได้254นั้นน่าจะเป็นสิ่งที่ควรคำนึงถึงดังนั้นฉันอาจตรวจสอบความเป็นเอกลักษณ์โดยใช้เครื่องมือตรวจสอบความถูกต้องในกรณีนั้น
เซบาสเตียน Sulinski

12
สำหรับLaravel 5.4ให้ใช้\Illuminate\Database\Schema\Builder::defaultStringLength(191);สำหรับเส้นทางอ้างอิงฟังก์ชั่นที่ถูกต้อง
webcoder

5
หลังจากทำการกำหนดค่าใน AppServiceProvider.php ปัญหานี้ยังคงเกิดขึ้น ฉันแค่สับสน ทำไม? ฉันรีสตาร์ทเซิร์ฟเวอร์ฐานข้อมูลและทุกอย่าง แต่ยังคงอยู่ กรุณาช่วย.
Koushik Das

3
คุณต้องตั้งค่าความยาวของคอลัมน์ที่จัดทำดัชนีตามขีด จำกัด 767 ไบต์ โปรดทราบว่า VARCHAR อาจมี 1, 2 หรือ 4 ไบต์สำหรับแต่ละหน่วยความยาว ตัวอย่าง: utf8_mb4 (4 ไบต์) -> 767/4 = 191 มิฉะนั้น utf8_general_ci สำหรับ VARCHAR (X) กับ X <85 (1 byte) = O (85) หรือ utf8_general_ci สำหรับ VARCHAR (X) ด้วย X> = 86 (2) ไบต์) -> 767/2 = 383 พิจารณาคอลัมน์อื่น ๆ ที่มีความยาวในดัชนีคอลัมน์หลายคอลัมน์
Jackie Degl'Innocenti

2
คุณอาจต้องการแก้ไขความยาวของคอลัมน์เฉพาะโดยตรงในไฟล์การโอนย้ายโดยระบุความยาวเริ่มต้นสำหรับคอลัมน์สตริงทั้งหมดเนื่องจากคอลัมน์บางคอลัมน์จะไม่ต้องการข้อ จำกัด นี้เนื่องจากไม่มีอยู่ในดัชนีใด ๆ $ table-> สตริง ( 'column_name' 191);
Jackie Degl'Innocenti

109

อัปเดต 1

ในฐานะของLaravel 5.4การเปลี่ยนแปลงเหล่านั้นไม่จำเป็นอีกต่อไป

Laravel 5.4 ใช้อักขระ utf8mb4 ที่ตั้งไว้ตามค่าเริ่มต้นซึ่งรวมถึงการรองรับการจัดเก็บ "emojis" ในฐานข้อมูล หากคุณกำลังอัพเกรดแอปพลิเคชันของคุณจาก Laravel 5.3 คุณไม่จำเป็นต้องเปลี่ยนไปใช้ชุดอักขระนี้

อัปเดต 2

รุ่น MariaDB ปัจจุบันที่ผลิตไม่รองรับการตั้งค่านี้ตามค่าเริ่มต้นทั่วโลก มันถูกนำมาใช้ในMariaDB 10.2.2+ โดยค่าเริ่มต้น

สารละลาย

และถ้าคุณต้องการใช้ค่าเริ่มต้นในอนาคตที่ถูกต้อง (เริ่มจาก Laravel 5.4) UTF8 รองรับหลายไบต์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 ของคุณ หลังจากนั้นก็เริ่ม Hot RESTART อาจไม่ทำงาน

sudo systemctl stop mysqld
sudo systemctl start mysqld

ตอนนี้คุณมี Laravel 5.x พร้อมรองรับ UTF8 แล้ว


3
สิ่งนี้อาจดีพอกับ MySQL 5.5 (ไม่ได้ลองกำหนดค่าใหม่) 5.7 (อาจเป็น 5.6) ยังทำงานได้โดยไม่ต้องตั้งค่าใหม่ 5.7 คือการแจกจ่าย Community Server ดีฟอลต์ที่มีการกำหนดค่าวานิลลา
Pjotr

ฉันเปลี่ยนเครื่องยนต์ในฐานข้อมูลของฉัน php ตามที่คุณเอ่ยถึง แต่มันยังคงสร้างตารางที่มีแถว = compact ซึ่งเป็นสาเหตุของปัญหา ฉันไม่เข้าใจคุณกำลังบอกว่ามันไม่พอที่จะทำการเปลี่ยนแปลงใน database.php และมันก็จำเป็นที่จะต้องทำการเปลี่ยนแปลงในไฟล์ my.cnf?
vesperknight

ก็เพียงพอที่จะทำการเปลี่ยนแปลงในdatabase.phpไฟล์กำหนดค่าและจะส่งผลกระทบต่อโครงการ Laravel ท้องถิ่น ต้องแน่ใจว่าdeleteฐานข้อมูลก่อนทำการเปลี่ยนแปลงและสร้างด้วยการตั้งค่าใหม่ คุณต้องเปลี่ยนmy.cnfไฟล์กำหนดค่าสำหรับการเปลี่ยนแปลงด้านเซิร์ฟเวอร์ทั่วโลกเท่านั้น (ปัจจุบันใช้การติดตั้งใหม่ทั้งหมดutf8mb4)
ผู้ทำประตู

หรือ - เพิ่มฟิลด์อื่นคำนวณแฮชของอีเมลสร้างฟิลด์ที่ไม่ซ้ำกันแก้ปัญหาตลอดไปหลีกเลี่ยงการเล่นซอกับตัวแปรการเริ่มต้นฐานข้อมูล
NB

หากใครใช้ Doctrine 2คุณสามารถตั้ง ROW_FORMAT ได้โดยส่งoptions={"row_format"="DYNAMIC"}ไปที่@Tableคำอธิบายประกอบ
Albert221

50

หากคุณอยู่หรืออัปเดตเป็น Laravel 5.4 นี่ใช้งานได้สำหรับฉัน

เพียงแค่ 1 การเปลี่ยนแปลง ใน AppServiceProvider.php

use Illuminate\Support\Facades\Schema;

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

ดังที่กล่าวไว้ในคู่มือการโยกย้ายhttps://laravel.com/docs/master/migrations#creating-indexes


ฉันทำสิ่งนี้กับการย้ายถิ่นของตัวเอง
Amirmasoud

7
นี่คือ (สมมุติ) เนื่องจากอักขระแต่ละตัวใช้เวลาถึง 4 ไบต์อย่างแน่นอนและความยาวสูงสุดของคีย์จะวัดเป็นไบต์ไม่ใช่อักขระ ดังนั้นความยาวของคีย์จะเท่ากับ 191 * 4 = 764 ไบต์เพียง smidgen ภายใต้สูงสุด 767 ไบต์ฐานข้อมูลจะสนับสนุน การแก้ปัญหาจำเป็นต้องมีคำอธิบาย IMO หากพวกเขามีส่วนร่วมในการแบ่งปันความรู้ที่นี่และไม่เพียง แต่ให้ "ขั้นตอน" แต่การแก้ไขมีประโยชน์อย่างไรก็ตาม
Jason

33

หากใครอื่นสะดุดกับคำตอบนี้เหมือนฉัน แต่ด้วยเหตุผลอื่นคุณสามารถตรวจสอบตัวอักษร / การเรียง Lar Lar DB ของคุณ

ฉันกำลังติดตั้งแอปพลิเคชั่น (Snipe-IT) และได้กำหนดค่าการตั้งค่าฐานข้อมูล Laravel เพื่อใช้งานต่อไปนี้:

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

การนำออกmb4จากทั้งสองสายแก้ไขปัญหาแม้ว่าฉันเชื่อว่าคำตอบของอันโตนิโอเป็นทางออกที่แท้จริงของปัญหา


21

สิ่งนี้ใช้ได้กับฉัน:

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


สิ่งนี้ใช้ได้สำหรับฉัน ฉันใช้รุ่นเซิร์ฟเวอร์: 10.1.22-MariaDB - การกระจายแหล่งที่มา
นักพัฒนาเว็บใน Pune

16

ลบ mb4 จาก charset และ collation จาก config / database.php จากนั้นจะสามารถดำเนินการได้สำเร็จ
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',


15

สำหรับ 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'

14

ฉันประสบปัญหาเดียวกันและแก้ไขได้โดยเพิ่มสองบรรทัดด้านล่างใน app / database.php ของฉัน

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

ไฟล์ของฉันดูเหมือนว่าด้านล่าง:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Database Connection Name
    |--------------------------------------------------------------------------
    |
    | Here you may specify which of the database connections below you wish
    | to use as your default connection for all database work. Of course
    | you may use many connections at once using the Database library.
    |
    */

    'default' => env('DB_CONNECTION', 'mysql'),

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

    ......

2
หากคุณติดตั้งเวอร์ชันใหม่ใน Laravel โปรดลบ 'mb4' ออกจาก utf8mb4 & utf8mb4_unicode_ci & config / database.php
Muthu17

13

สำหรับ laravel 5.4 เพียงแก้ไขไฟล์

App \ ผู้ให้บริการ \ AppServiceProvider.php

use Illuminate\Support\Facades\Schema;

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

7
File: config/database.php
change the following
FROM ->
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

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

1
ขณะนี้อาจตอบคำถามได้ดีกว่าที่จะเพิ่มคำอธิบายบางอย่างเกี่ยวกับวิธีที่คำตอบนี้อาจช่วยแก้ปัญหา โปรดอ่านฉันจะเขียนคำตอบที่ดีเพื่อทราบข้อมูลเพิ่มเติมได้อย่างไร
Roshana Pitigala

6

ฉันมีปัญหาเดียวกันและฉันกำลังใช้ wamp

วิธีแก้ไข: เปิดไฟล์: config / database.php

'engine' => null, => 'engine' => 'InnoDB',

ขอบคุณ


คำตอบก่อนหน้านี้ไม่เหมาะกับฉันเลย แต่คำตอบนี้ใช้ได้เหมือนมนต์เสน่ห์! และมันก็สมเหตุสมผลดีฉันเชื่อว่าในรุ่นก่อนหน้าของเครื่องยนต์ Laravel DB นั้นถูกตั้งค่าเป็น InnoDB ตามค่าเริ่มต้นดังนั้นเราจึงไม่พบข้อผิดพลาดเหล่านี้ก่อนหน้านี้
Sasa Blagojevic

ใช่จำเป็นต้องทำสองคำตอบอื่น ๆ และสิ่งนี้เช่นกัน
แอนดรู

6

ในไฟล์ config / database.php โดยที่:

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

เปลี่ยนบรรทัดนี้เป็น:

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

5

สำหรับLaravel> = 5.6ผู้ใช้

เปิดAppServiceProvider.phpไฟล์

ใช้คลาสต่อไปนี้

use Illuminate\Support\Facades\Schema;

จากนั้นภายในbootวิธีการเพิ่มบรรทัดต่อไปนี้

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

4

ฉันเพิ่มการโยกย้ายตัวเอง

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

ใช่ฉันรู้ว่าฉันต้องพิจารณาทุกครั้งที่มีการย้ายข้อมูล แต่ฉันต้องการมากกว่าที่จะซ่อนตัวอยู่ในผู้ให้บริการที่ไม่เกี่ยวข้องอย่างสมบูรณ์


4

หากใครบางคนมีปัญหานี้แม้หลังจากทำแล้วการเปลี่ยนแปลงที่กล่าวถึงข้างต้น ตัวอย่างเช่นในกรณีของฉันฉันได้ทำการเปลี่ยนแปลงด้านล่าง

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
  /**
   * Register any application services.
   *
   * @return void
   */
   public function register()
   {
      //
   }

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

แต่มันจะไม่ทำงานทันทีด้วยเหตุผลสองประการ หนึ่งคือถ้าคุณใช้ลูเมนแทน laravel คุณอาจต้องยกเลิกหมายเหตุบรรทัดนี้ในไฟล์ app.php ก่อน

$app->register(App\Providers\AppServiceProvider::class);

จากนั้นคุณต้องสร้างสคริปต์การย้ายข้อมูลอีกครั้งด้วยคำสั่ง artisan

php artisan make:migration <your_table_name>

ตั้งแต่ตอนนี้เฉพาะการเปลี่ยนแปลงที่คุณทำกับ ServiceProvider เท่านั้นที่จะใช้งานได้


4

สำหรับ laravel 5.7 เขียนโค้ดเหล่านี้ใน appserviceprovider.php

  use Illuminate\Support\Facades\Schema;

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

2

เปลี่ยนชุดอักขระเป็นจาก 'utf8mb4' เป็น 'utf8' และ

การเรียงหน้าเป็น 'utf8mb4_unicode_ci' เป็น 'utf8_unicode_ci'

ในไฟล์ config / database.php

มันใช้งานได้สำหรับฉัน


2

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

use Illuminate\Support\Facades\Schema;

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

คุณสามารถตรวจสอบจาก

https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes


ขอบคุณทำงานให้ฉัน mamp mysql ที่มี laravel 5.6.23
bluesky

2

เป็นเพราะLaravel 5.4ใช้utf8mb4ซึ่งรองรับการจัดเก็บอิโมจิ

เพิ่มสิ่งนี้ในแอปของคุณ\ ผู้ให้บริการ \ AppServiceProvider.php

use Illuminate\Support\Facades\Schema;

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

และคุณควรจะไปดี


2

หากคุณใช้งานหรืออัปเดตเป็น Laravel 5.4 และเวอร์ชันล่าสุดจะใช้งานได้
เพียง 1 การเปลี่ยนแปลงใน AppServiceProvider.php

use Illuminate\Support\Facades\Schema;

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

1

ฉันต้องการจะชี้ให้เห็นสิ่งที่ฉันคิดถึง ...

ฉันใหม่ที่ Laravel และฉันไม่ได้คัดลอก "ใช้ Illuminate ..... " เพราะฉันไม่ได้จ่ายจริงเพราะด้านบนของฟังก์ชั่นการบูตที่คุณอ่านมีข้อความชี้แจงการใช้งาน

หวังว่าจะช่วยทุกคน

**use Illuminate\Support\Facades\Schema;**

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

คุณสามารถนำหน้าซุ้มใดก็ได้ด้วย\
Ohgodwhy

1

ฉันมีปัญหาเปลี่ยนการกำหนดค่าของ 'config / ฐานข้อมูล'

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

รักษารูปแบบเดียวกันในฐานข้อมูล

จากนั้นฉันก็สั่ง

php artisan migrate

1

ใน 24 ตุลาคม 2559 Taylor Otwellผู้แต่ง Laravel ประกาศบน Twitter

"utf8mb4" จะเป็นอักขระ MySQL เริ่มต้นที่ตั้งค่าใน Laravel 5.4 เพื่อการรองรับอิโมจิที่ดียิ่งขึ้น 🙌 Taylor Otwell Twitter โพสต์

ซึ่งก่อนหน้าเวอร์ชั่น 5.4 ชุดอักขระคือ utf8

ในช่วงศตวรรษนี้เว็บแอปมากมายรวมถึงการแชทหรือแพลตฟอร์มบางประเภทเพื่อให้ผู้ใช้ของพวกเขาสามารถสนทนาและหลายคนชอบใช้อิโมจิหรือยิ้ม และนี่คืออักขระพิเศษบางประเภทที่ต้องการพื้นที่เก็บเพิ่มเติมและสามารถใช้utf8mb4เป็นชุดอักขระได้เท่านั้น นั่นคือเหตุผลที่พวกเขาย้ายไปที่utf8mb4เพียงเพื่อพื้นที่

หากคุณค้นหาในIlluminate\Database\Schema\Builderชั้นเรียนคุณจะเห็นว่า$defaultStringLengthมีการตั้งค่าเป็น255และการปรับเปลี่ยนที่คุณสามารถดำเนินการผ่านSchemaซุ้มและโทรdefaultStringLengthวิธีการและผ่านความยาวใหม่

เพื่อทำการเปลี่ยนแปลงนั้นเรียกวิธีการนั้นในAppServiceProviderชั้นเรียนของคุณซึ่งอยู่ภายใต้ไดเรกทอรีย่อยของแอพ \ ผู้ให้บริการเช่นนี้

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // all other code ...

        Schema::defaultStringLength(191); 
    }
    // and all other code goes here
}

ฉันจะแนะนำให้ใช้191เป็นค่าเพียงเพราะ MySQL รองรับ 767 ไบต์และเนื่องจาก767 / 4จำนวนไบต์ที่ใช้โดยอักขระหลายไบต์แต่ละตัวคุณจะได้รับ191ซึ่งเป็นหมายเลขของไบต์ใช้เวลาโดยตัวละครแต่ละตัวสัญลักษณ์คุณจะได้รับ

คุณสามารถเรียนรู้เพิ่มเติมได้ที่นี่ ชุดอักขระ utf8mb4 (การเข้ารหัส Unicode แบบ 4 ไบต์ UTF-8) การ จำกัด จำนวนคอลัมน์และขนาดแถวของตาราง


นี่เป็นคำตอบเดียวที่อธิบาย191จำนวนเวทย์มนตร์
Illya Moskvin

1

สารละลาย:

ก่อนอื่นให้เปลี่ยน defaultStringLength เป็น 191 ในแอพ \ Providers \ AppServiceProvider.php :

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

จากนั้นเปลี่ยนค่าชุดอักขระและการเปรียบเทียบดังต่อไปนี้ในconfig \ database.php :

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

( ลิงก์เกี่ยวกับ MariaDB charset )


1

ไปที่ของคุณconfig/database.phpและเปลี่ยนชุดอักขระและการเปรียบเทียบจาก utf8mb4 เป็น utf8

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

ปัญหาของฉันแก้ไขโดยใช้วิธีนี้โชคดีนะเพื่อน!


0

คุณจะไม่มีปัญหานี้หากคุณใช้ MySQL 5.7.7+ หรือ MariaDB 10.2.2+

หากต้องการอัปเดต MariaDB บน ​​Mac ของคุณโดยใช้ Brew ให้ยกเลิกการเชื่อมโยงอันปัจจุบัน: brew unlink mariadbจากนั้นติดตั้ง dev one ที่ใช้brew install mariadb --devel

หลังจากติดตั้งเสร็จแล้วให้หยุด / เริ่มบริการที่ทำงานอยู่: brew services stop mariadb brew services start mariadb

เวอร์ชัน dev ปัจจุบันคือ 10.2.3 หลังจากการติดตั้งเสร็จสิ้นคุณไม่ต้องกังวลเกี่ยวกับเรื่องนี้อีกต่อไปและคุณสามารถใช้ utf8mb4 (ซึ่งตอนนี้เป็นค่าเริ่มต้นใน Laravel 5.4) โดยไม่เปลี่ยนกลับเป็น utf8 หรือแก้ไข AppServiceProvider ตามที่เสนอในเอกสาร Laravel: https: // laravel .com / docs / master / release # laravel-5.4 (เลื่อนลงไปที่: การโยกย้ายความยาวสตริงเริ่มต้น )


0

เพิ่งติดตั้ง MariaDB 10.2.4 RC ยิงโครงการเปล่า Laravel 5.4 ใหม่และการโยกย้ายเริ่มต้น (คอลัมน์ varchar (255))

ไม่จำเป็นต้องมีการเปลี่ยนแปลง DB conf และ config/database.phpLaravael ดังนั้นเช่นเดียวกับ @scorer ที่บันทึกไว้เกี่ยวกับพฤติกรรมเริ่มต้นสำหรับ 10.2.2+


0

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

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

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

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

0

ตั้งค่าเอ็นจิ้นฐานข้อมูล InnoDB:

  Schema::create('users', function (Blueprint $table) {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

0

หากคุณได้ลองคำตอบอื่น ๆ แล้ว แต่ยังไม่ได้ผลคุณสามารถดร็อปตารางทั้งหมดจากฐานข้อมูลแล้วดำเนินการคำสั่ง migrate พร้อมกันโดยใช้คำสั่งนี้:

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