लारवल प्रवासन त्रुटि: सिंटैक्स त्रुटि या पहुंच उल्लंघन: 1071 निर्दिष्ट कुंजी बहुत लंबी थी; अधिकतम कुंजी लंबाई 767 बाइट्स है


177

लारवेल 5.4 पर माइग्रेशन त्रुटि php artisan make:auth

[Illuminate \ Database \ QueryException] SQLSTATE [42000]: सिंटैक्स त्रुटि या पहुंच उल्लंघन: 1071 निर्दिष्ट कुंजी बहुत लंबी थी; अधिकतम कुंजी लंबाई 767 बाइट्स है (SQL: परिवर्तन tabl e usersadd uniqueusers_email_unique ( email))

[PDOException] SQLSTATE [42000]: सिंटैक्स त्रुटि या पहुंच उल्लंघन: 1071 निर्दिष्ट कुंजी बहुत लंबी थी; अधिकतम कुंजी लंबाई 767 बाइट्स है


3
आपको अपने प्रश्न का उत्तर एक उत्तर में देना चाहिए। सवाल में नहीं। stackoverflow.com/help/self-answer
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 के साथ अपने DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; आप 767 अधिकतम की लंबाई की सीमा से अधिक हैं। @Scaisedge द्वारा


3
इस समाधान के बारे में सावधान रहें। यदि आप उदाहरण के लिए ईमेल फ़ील्ड को अनुक्रमित करते हैं, तो संग्रहीत ईमेल में केवल 191 वर्णों की अधिकतम लंबाई हो सकती है। यह आधिकारिक आरएफसी राज्यों की तुलना में कम है।
शॉक_गोन_विल्ड


यह काम कर रहा है और एक वैध समाधान है, लेकिन मैं सिर्फ यह बताना चाहता था कि इस दृष्टिकोण का उपयोग करके संभावित नुकसान हो सकते हैं।
शॉक_गोन_विल्ड

मुझे उम्मीद है कि यह समाधान भविष्य में मुझे गधे में काटने के लिए नहीं आता है, लेकिन अभी के लिए, यह काम करता है। हालांकि मुझे ईमेल कैसे इंडेक्स करना है, इस बारे में सावधान रहना होगा।
ड्यूसोफ्नुल

4
क्यों 191 अक्षर @absiddiqueLive
PseudoAj

121

मुझे नहीं पता कि उपरोक्त समाधान और आधिकारिक समाधान क्यों जोड़ रहा है

Schema::defaultStringLength(191);

में AppServiceProviderमेरे लिए काम नहीं किया। database.phpफ़ाइल में configफ़ोल्डर में संपादन के लिए क्या काम किया गया था । बस संपादित करें

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

सेवा

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

और यह काम करना चाहिए, हालांकि आप इमोजी जैसे विस्तारित मल्टीबाइट पात्रों को स्टोर करने में असमर्थ होंगे

मैंने इसे Laravel 5.7 के साथ किया। आशा करता हूँ की ये काम करेगा।


5
इस वर्ण सेट का उपयोग करने से आपको केवल मानक ASCII को बचाने की अनुमति मिलेगी, और अरबी, हिब्रू, अधिकांश यूरोपीय लिपियों और निश्चित रूप से इमोजी जैसे विशेष चरित्रों को बहु-स्तरीय नहीं। यह भी देखें stackoverflow.com/a/15128103/4233593
जेफ पकेट

7
मुझे लगता है कि आपने इस भाग use Illuminate\Support\Facades\Schema;को सबसे ऊपर रखा।
पिंपस

@ KoushikDas लारवेल का आप किस संस्करण का उपयोग कर रहे हैं?
पिंपेस

अब मैं 6.0 पर हूं। मुझे लगता है कि मैंने इसे शुरू में 5.7 या 5.6 के साथ किया था।
कौशिक दास

2
utf8mb4मिलान एक कारण के लिए वहाँ है, मैं अगर आप कर सकते हैं इसका इस्तेमाल करने की सलाह देते हैं।
फ्लेम

85

मैं यहाँ केवल इस उत्तर को जोड़ रहा हूँ क्योंकि यह quickestमेरे लिए समाधान है। बस डिफ़ॉल्ट डेटाबेस इंजन को 'InnoDB'चालू करें

/config/database.php

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

फिर php artisan config:cacheकॉन्फ़िगरेशन कैश को साफ़ करने और ताज़ा करने के लिए चलाएँ


1
इस सवाल का आधिकारिक उत्तर / समाधान होना चाहिए ... धन्यवाद
Syamsoul Azrien

1
यह वास्तविक समाधान है, अन्य वर्कअराउंड हैं
लुइस कुन्हा

3
लेकिन इसके पीछे क्या तर्क है
जुल्फिकार तारिक

1
यही सही उपाय है। लेकिन क्यों नहीं इसे डिफ़ॉल्ट स्थापना में शामिल किया गया है।
अंकित चौहान

38

में AppServiceProvider.php, आप फ़ाइल के इस कोड को शामिल करते हैं।

use Illuminate\Support\Facades\Schema;

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

धन्यवाद ने मेरी मदद की
द डेड मैन

24

डेटाबेस संस्करण द्वारा Laravel 5.4 में यह समस्या होती है।

डॉक्स के अनुसार ( Index Lengths & MySQL / MariaDBअनुभाग में):

लारवेल utf8mb4डिफ़ॉल्ट रूप से सेट किए गए वर्ण का उपयोग करता है , जिसमें डेटाबेस में "इमोजीस" के भंडारण के लिए समर्थन शामिल है। यदि आप 5.7.7 रिलीज़ से पुराने MySQL का संस्करण चला रहे हैं या 10.2.2 रिलीज़ से अधिक पुराना MariaDB है, तो आपको उनके लिए अनुक्रमणिका बनाने के लिए MySQL के लिए माइग्रेशन द्वारा उत्पन्न डिफ़ॉल्ट स्ट्रिंग लंबाई को मैन्युअल रूप से कॉन्फ़िगर करने की आवश्यकता हो सकती है। आप Schema::defaultStringLengthअपने भीतर विधि को कॉल करके इसे कॉन्फ़िगर कर सकते हैं AppServiceProvider

दूसरे शब्दों में, में <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 वर्णों की अधिकतम लंबाई हो सकती है। यह आधिकारिक आरएफसी राज्यों की तुलना में कम है।

तो प्रलेखन भी एक और समाधान का प्रस्ताव:

वैकल्पिक रूप से, आप 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

मेरी समस्या वास्तव में इस समाधान से हल थी। मेरे क्षेत्र ईमेल नहीं थे।
थरका देविंदा

11

यदि आप कमांड का उपयोग करते समय लार्वा पर काम करते समय इस त्रुटि का सामना करते हैं: php artisan migrate तो आप फ़ाइल में केवल 2 लाइनें जोड़ते हैं: ऐप-> प्रदाता-> AppServiceProvider.php

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

कृपया इस छवि की जाँच करें । फिर से php artisan migrateकमांड चलाएं ।


1
'स्कीमा का उपयोग करें' जोड़ना बहुत महत्वपूर्ण है। तो यह सबसे अच्छा जवाब है
hxwtch

आप 2 लाइन से पहले एक बैकवर्ड स्लैश '\' को जोड़कर एक पंक्ति में भी ऐसा कर सकते हैं\Schema::defaultStringLength(191);
ताहिर अफरीदी

10

मैं दो द्वारा जोड़ा जा रहा sollution मेरे लिए है कि काम करते हैं।

पहला लक्षण है :

  1. ओपन database.php फ़ाइल insde config dir / फ़ोल्डर।
  2. को संपादित 'engine' => null,करें'engine' => 'InnoDB',

    इसने मेरे लिए काम किया।

दूसरा प्रदूषण है:

  1. ओपन database.php फ़ाइल insde config dir / फ़ोल्डर।
    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

मैंने इस समस्या को हल कर लिया है और अपने डेटाबेस- ('charset' => 'utf8') और ('collation' => 'utf8_general_ci') की तरह अपने 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' => 'utf8',
        'collation' => 'utf8_general_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

8

मुझे इस त्रुटि के दो समाधान मिले हैं

विकल्प 1:

डेटाबेस / माइग्रेशन फ़ोल्डर में अपना उपयोगकर्ता और पासवर्ड_सेट टेबल खोलें

और बस ईमेल की लंबाई बदलें:

$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 लार्वा को फिर से कॉन्फ़िगर करने के लिए चलाएं

3- अपने डेटाबेस में मौजूदा टेबल हटाएं और फिर से चलाने के php artisan migrateफिर से


1
यह लार्वा 5.8 के लिए सबसे अच्छा जवाब है। लेकिन पहले से बनाई गई तालिकाओं को हटा दें
मैगी डेनियल

लेकिन प्रलेखन के अनुसार "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);
}

नोट: सबसे पहले आपको (यदि आपके पास है) उपयोगकर्ता तालिका, डेटाबेस से पासवर्ड_सेसेट टेबल और माइग्रेशन से उपयोगकर्ता और पासवर्ड_ प्रविष्टियाँ प्रविष्टियाँ हटाना है तालिका।

अपने सभी बकाया पलायन को चलाने के लिए, migrateकारीगर कमांड निष्पादित करें :

php artisan migrate

उसके बाद सब कुछ सामान्य की तरह काम करना चाहिए।


4

जैसा कि पहले ही निर्दिष्ट किया गया है कि हम App / Providers में 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 / मारियाडीबी के लिए खोज") 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

समाधान कोई भी नहीं बताता है कि मैसकल v5.5 और बाद में InnoDB डिफ़ॉल्ट स्टोरेज इंजन है जिसमें यह समस्या नहीं है, लेकिन कई मामलों में खान की तरह कुछ पुराने mysql ini कॉन्फ़िगरेशन फाइलें हैं जो नीचे की तरह पुराने MYISAM स्टोरेज स्टोरेज का उपयोग कर रहे हैं।

default-storage-engine=MYISAM

जो इन सभी समस्याओं को पैदा कर रहा है और समाधान है कि डिफ़ॉल्ट-स्टोरेज-इंजन को एक बार और अस्थायी हैक करने के बजाय , मैसिकल इनआई कॉन्फ़िगरेशन फ़ाइल में इनोबीडी में बदल दिया जाए ।

default-storage-engine=InnoDB

और यदि आप MySql v5.5 पर हैं या बाद में हैं तो InnoDB डिफ़ॉल्ट इंजन है, इसलिए आपको इसे ऊपर की तरह स्पष्ट रूप से सेट करने की आवश्यकता नहीं है, बस default-storage-engine=MYISAMइसे हटा दें यदि यह आपकी iniफ़ाइल से मौजूद है और आप जाने के लिए अच्छे हैं।


धन्यवाद! मुझे यह सुझाव लार्वा 6 और mysql 5.6 के साथ काम करने के लिए स्ट्रिंग लंबाई, चारसेट, और कोलाजेशन के संयोजन के साथ उपयोग करना था। उम्मीद है कि यह भविष्य में दूसरों की मदद करता है।
कैस्पर विल्क्स

@CasperWilkes आपको उस स्ट्रिंग लंबाई, चारसेट सामान में से कोई भी करने की आवश्यकता नहीं है। अपने Mysql सिस्टम वैरिएबल को ऐसे चेक करें जैसे यह ONshow global variables like 'innodb_large_prefix'; होना चाहिए । यदि यह बंद है तो आप इस उत्तर की जांच कर सकते हैं कि इसे कैसे चालू करें। और यहाँ dev.mysql.com पर innodb_large_prefix के बारे में अधिक जानकारी है।
अली ए। ढिल्लों

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();

सफलतापूर्वक परिवर्तन के बाद आप माइग्रेशन चला सकते हैं।
नोट: सबसे पहले आपको डेटाबेस से उपयोगकर्ता तालिका , पासवर्ड_ पासवर्ड तालिका (यदि आपके पास है) को हटाना होगा और प्रवासन तालिका से उपयोगकर्ता और पासवर्ड_ प्रविष्टियाँ प्रविष्टियाँ हटानी होंगी।


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
यह मेरे लिए सबसे बेहतर है क्योंकि मैं किसी भी लारवेल कोर कोड को ट्विस्ट नहीं करूंगा।
ओकिमुते ओमुता

2

यह सामान्य है क्योंकि Laravel 5.4 ने डिफ़ॉल्ट डेटाबेस charater को utf8mb4 में बदल दिया है। आपको क्या करना है, यह है: वर्ग घोषणा से पहले इस कोड को डालकर अपने App \ Providers.php को संपादित करें

use Illuminate\Support\Facades\Schema;

इसके अलावा, इसे 'बूट' फंक्शन में जोड़ें Schema::defaultStringLength(191);


2

यदि आपके पास कोई डेटा पहले से ही आपको सौंपा नहीं गया है, तो निम्न कार्य करें:

  1. ऐप / प्रदाता / AppServiceProvide.php पर जाएं और जोड़ें

Illuminate \ Support \ ServiceProvider का उपयोग करें;

और विधि बूट के अंदर ();

स्कीमा :: defaultStringLength (191);

  1. अब पूर्व के लिए अपने डेटाबेस, उपयोगकर्ता तालिका में रिकॉर्ड हटाएं।

  2. निम्नलिखित चलाएं

php कारीगर विन्यास: कैश

php कारीगर पलायन करते हैं


यह काम किया है लेकिन जोड़ने की जरूरत use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider;पहले से ही है। आशा है कि आप इसे सही करेंगे
जिमीश गामित

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


नहींं, 18.04 में मारीदब 10.1.41 में भी यह त्रुटि है।
NoBugs 6

1

मुझे लगता है कि स्ट्रेंजनल को 191 के लिए मजबूर करना एक बहुत बुरा विचार है। इसलिए मैं यह समझने के लिए जांच करता हूं कि क्या चल रहा है।

मैंने देखा कि यह संदेश त्रुटि है:

SQLSTATE [42000]: सिंटैक्स त्रुटि या पहुंच उल्लंघन: 1071 निर्दिष्ट कुंजी बहुत लंबी थी; अधिकतम कुंजी लंबाई 767 बाइट्स है

मेरे MySQL संस्करण को अपडेट करने के बाद दिखाना शुरू किया। इसलिए मैंने PHPMyAdmin के साथ तालिकाओं की जाँच की है और मैंने देखा है कि बनाए गए सभी नए टेबल पुराने लोगों के लिए utf8_unicode_ci के बजाय collation utf8mb4_unicode_ci के साथ थे ।

अपने सिद्धांत विन्यास फ़ाइल में, मैंने देखा कि charset utf8mb4 पर सेट किया गया था, लेकिन मेरे सभी पिछले टेबल utf8 में बनाए गए थे, इसलिए मुझे लगता है कि यह कुछ अपडेट जादू है कि यह utf8mb4 पर काम करना शुरू कर देता है।

अब आसान तरीका यह है कि आप अपने ORM कॉन्फ़िग फ़ाइल में लाइन चारसेट को बदलें। तब utf8mb4_unicode_ci का उपयोग करके तालिकाओं को छोड़ने के लिए यदि आप देव मोड में हैं या यदि आप उन्हें छोड़ सकते हैं तो चार्ज को ठीक करें।

सिम्फनी 4 के लिए

change charset: utf8mb4 to charset: utf8 in config / package / doctrine.yaml

अब मेरे सिद्धांत पलायन फिर से ठीक काम कर रहे हैं।


1

अनुशंसित समाधान सक्षम करने के लिए है innodb_large_prefix MySQL के विकल्प ताकि आप बाद की समस्याओं में शामिल न हों। और यहाँ है कि कैसे करना है:

my.iniMySQL कॉन्फ़िगरेशन फ़ाइल खोलें और [mysqld]इस तरह से नीचे की पंक्तियों को लाइन के नीचे जोड़ें ।

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

उसके बाद, अपने परिवर्तनों को सहेजें और अपनी MySQL सेवा को पुनरारंभ करें।

रोलबैक यदि आपको आवश्यकता है और फिर अपना माइग्रेशन फिर से चलाएं।


बस अगर आपकी समस्या अभी भी बनी हुई है, तो अपनी डेटाबेस कॉन्फ़िगरेशन फ़ाइल पर जाएं और सेट करें

'engine' => null, सेवा 'engine' => 'innodb row_format=dynamic'

आशा करता हूँ की ये काम करेगा!


1

पहले डेटाबेस के सभी तालिकाओं को लोकलहोस्ट में हटा दें

फ़ाइल कॉन्फ़िगरेशन / डेटाबेस में Laravel डिफ़ॉल्ट डेटाबेस (utf8mb4) गुण बदलें:

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

उसके बाद मेरे स्थानीय डेटाबेस गुण utf8_unicode_ci को बदलना। php कारीगर पलायन यह ठीक है।


0

किसी और के लिए जो इसमें भाग सकता है, मेरा मुद्दा यह था कि मैं एक प्रकार का कॉलम बना रहा था stringऔर ->unsigned()जब मैं इसके लिए पूर्णांक होना चाहता था तो इसे बनाने की कोशिश कर रहा था।


0

जिस काम के लिए यहाँ आया था वह मुख्य नाम (एक छोटा एक) के साथ एक दूसरा परम था:

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

0

मुझे यह त्रुटि तब भी हो रही थी जब मेरे पास पहले से ही था (वास्तव में क्योंकि मेरे पास पहले से ही था) स्कीमा :: 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();
});

1000 को हटाने या इसे 191 पर सेट करने से मेरी समस्या हल हो गई।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.