लारावेल प्रवास: अद्वितीय कुंजी बहुत लंबी है, भले ही निर्दिष्ट हो


166

मैं लारवेल में एक उपयोगकर्ता तालिका को स्थानांतरित करने की कोशिश कर रहा हूं। जब मैं अपना माइग्रेशन चलाता हूं तो मुझे यह त्रुटि मिलती है:

[Illuminate \ Database \ QueryException] SQLSTATE [42000]: सिंटैक्स त्रुटि या पहुंच उल्लंघन: 1071 निर्दिष्ट कुंजी बहुत लंबी थी; अधिकतम कुंजी की लंबाई 767 बाइट्स है (SQL: परिवर्तन तालिका usersमें अद्वितीय यूजर्स जोड़ें_मैल_कुनीक ( 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');
});

कुछ गुगली के बाद मैं इस बग रिपोर्ट में आया, जहां टेलर कहता है कि आप सूचकांक कुंजी को 2 के पैरामीटर के रूप में निर्दिष्ट कर सकते हैं unique(), जो मैंने किया है। यह अभी भी त्रुटि देता है। यहाँ क्या हो रहा है?


आप ई-मेल के लिए 320 वर्णों का उपयोग क्यों कर रहे हैं? यह आपकी समस्या हो सकती है।
एंटोनियो कार्लोस रिबेरो

1
यह वास्तव में समस्या थी, पता नहीं क्यों। लेकिन हां, आप सही हैं, मुझे नहीं पता कि मैंने प्रत्येक क्षेत्र के लिए चार लंबाई क्यों निर्दिष्ट की है। इन सीमाओं को हटा दिया है
harryg

यह मज़ेदार है कि किसी ने निश्चित लंबाई वाले क्षेत्र का उपयोग करने का सुझाव नहीं दिया है जिसमें ईमेल और वॉइला का हैश है - समस्या हमेशा के लिए हल की गई, किसी भी रूपरेखा के लिए और किसी भी संबंधपरक डेटाबेस के लिए। क्योंकि यह है कि हम विशिष्टता की गारंटी कैसे देते हैं - चर-लंबाई इनपुट के एक निश्चित-संख्या प्रतिनिधित्व का उपयोग करते हुए, इस तथ्य को देखते हुए कि संख्या सीमा पर्याप्त रूप से बड़ी है (और sha1 / sha256 के लिए)।
एनबी

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संभवतः इसे ध्यान में रखने लायक है, इसलिए मैं शायद उस मामले में सत्यापनकर्ता का उपयोग करके विशिष्टता को मान्य करूंगा।
सेबस्टियन सुलिंस्की

12
के लिए Laravel 5.4 , उपयोग \Illuminate\Database\Schema\Builder::defaultStringLength(191);सही समारोह संदर्भ पथ के लिए
webcoder

5
AppServiceProvider.php में कॉन्फ़िगरेशन करने के बाद, यह समस्या अभी भी हो रही है। मैं बस उलझन में हूं। क्यों? मैंने सर्वर, डेटाबेस और सब कुछ फिर भी पुनरारंभ किया। कृपया मदद कीजिए।
कौशिक दास

3
आपको 767 बाइट्स की सीमा के अनुसार अनुक्रमित कॉलम की लंबाई निर्धारित करनी होगी। ध्यान रखें कि VARCHAR में प्रत्येक लंबाई इकाई के लिए 1, 2 या 4 बाइट्स हो सकते हैं। उदाहरण: utf - बाइट्स) -> 767/2 = 383. कई कॉलम इंडेक्स में शामिल अन्य कॉलम पर भी विचार करें।
जैकी डेग'इन्नौस्टी

2
आप सभी स्ट्रिंग कॉलम के लिए डिफ़ॉल्ट लंबाई निर्दिष्ट करते हुए, माइग्रेशन फ़ाइलों में विशिष्ट कॉलम की लंबाई को सीधे संपादित करना चाह सकते हैं, क्योंकि सभी कॉलम को इस अवरोध की आवश्यकता नहीं होगी क्योंकि वे किसी भी सूचकांक में नहीं हैं। $ टेबल> स्ट्रिंग ( 'COLUMN_NAME', 191);
जैकी डेगल'इन्नौस्ती

109

अपडेट १

के रूप में Laravel 5.4 उन परिवर्तनों को कोई और अधिक की जरूरत है।

लारवेल 5.4 डिफ़ॉल्ट रूप से सेट utf8mb4 वर्ण का उपयोग करता है, जिसमें डेटाबेस में "इमोजीस" के भंडारण के लिए समर्थन शामिल है। यदि आप लारवेल 5.3 से अपना एप्लिकेशन अपग्रेड कर रहे हैं, तो आपको इस वर्ण सेट पर स्विच करने की आवश्यकता नहीं है।

अपडेट २

वर्तमान उत्पादन MariaDB संस्करण विश्व स्तर पर डिफ़ॉल्ट रूप से इस सेटिंग का समर्थन नहीं करते हैं। यह डिफ़ॉल्ट रूप से MariaDB 10.2.2+ में लागू किया गया है

उपाय

और यदि आप जानबूझकर सही भविष्य-डिफ़ॉल्ट (लारवेल 5.4 से शुरू) का उपयोग करना चाहते हैं, तो यूटीएफ 8 मल्टी-बाइट utf8mb4समर्थन के लिए support फिर अपने डेटाबेस कॉन्फ़िगरेशन को ठीक करना शुरू करें।

लारवेल में 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 सर्वर को रोकें । उसके बाद START। हॉट रिस्टार्ट काम नहीं कर सकता है।

sudo systemctl stop mysqld
sudo systemctl start mysqld

अब आपके पास UTF8 समर्थन के साथ Laravel 5.x है।


3
यह MySQL 5.5 के साथ काफी अच्छी तरह से जाग सकता है (पुन: कॉन्फ़िगर करने का प्रयास नहीं किया)। 5.7 (शायद 5.6 भी) ने बिना किसी पुनर्निधारण की आवश्यकता के काम किया। 5.7 वनीला विन्यास के साथ एक डिफ़ॉल्ट सामुदायिक सर्वर वितरण था।
पजोट्र

मैंने अपने डेटाबेस में इंजन बदल दिया है। यदि आपने उल्लेख किया है, लेकिन यह अभी भी पंक्ति = कॉम्पैक्ट के साथ तालिकाओं का निर्माण कर रहा है जो एक समस्या पैदा कर रहा है। मुझे पूरी तरह से समझ में नहीं आया, क्या आप कह रहे हैं कि डेटाबेस में यह बदलाव करना पर्याप्त नहीं है। पीएपी और यह भी आवश्यक है कि my.cnf फ़ाइल में परिवर्तन करें?
vesperknight

यह केवल database.phpविन्यास फाइल में परिवर्तन करने के लिए पर्याप्त है और यह स्थानीय लारवेल परियोजना को प्रभावित करेगा। deleteपरिवर्तन करने से पहले डेटाबेस के लिए सुनिश्चित करें और इसे नई सेटिंग्स के साथ बनाएं। आपको my.cnfकेवल वैश्विक सर्वर साइड परिवर्तनों (वर्तमान में सभी नए इंस्टॉलेशन का उपयोग utf8mb4) के लिए कॉन्फ़िगर फ़ाइल को बदलने की आवश्यकता है ।
स्कोरर

या - एक और फ़ील्ड जोड़ें, ईमेल के हैश की गणना करें, फ़ील्ड को अद्वितीय बनाएं, समस्या को हमेशा के लिए हल करें, डेटाबेस इनिशियलाइज़ेशन चर के साथ फ़िडलिंग से बचें।
एनबी

यदि कोई भी Doctrine 2 का उपयोग कर रहा है , तो आप options={"row_format"="DYNAMIC"}अपने @Tableएनोटेशन में पास होकर ROW_FORMAT सेट कर सकते हैं।
अल्बर्ट 221

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 में बताया गया है


मैंने प्रवास पर ही ऐसा किया था।
अमीरसौद

7
यह (संभवतया) क्योंकि प्रत्येक वर्ण में 4 बाइट्स होते हैं, और अधिकतम मुख्य लंबाई बाइट्स में मापी जाती है, वर्ण नहीं। तो कुंजी लंबाई 191 * 4 = 764 बाइट्स होगी, अधिकतम 767 बाइट्स के तहत सिर्फ एक smidgen डेटाबेस का समर्थन करेगा। यदि उन्हें यहां साझा ज्ञान में योगदान करना है, तो समाधान आईएमओ को स्पष्टीकरण की आवश्यकता है, न कि केवल "प्रक्रियाएं" प्रदान करें। लेकिन फिर भी एक आसान तय।
जेसन

33

अगर कोई भी इस जवाब पर ठोकर खाता है जैसे मैंने किया था, लेकिन एक अलग कारण से, आप अपने लारवेल डीबी की गड़बड़ी / टकराव की जांच कर सकते हैं।

मैं एक एप्लिकेशन (स्निप-आईटी) स्थापित कर रहा था और निम्नलिखित का उपयोग करने के लिए लारवेल डेटाबेस कॉन्फिगर को कॉन्फ़िगर किया था:

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

mb4दोनों तारों को हटाने से यह मुद्दा तय हो गया, हालांकि मेरा मानना ​​है कि एंटोनियो का जवाब समस्या का वास्तविक समाधान है।


21

यह मेरे लिए काम किया:

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


इसने मेरे लिए काम किया। मैं सर्वर संस्करण का उपयोग करता हूं: 10.1.22-मारियाबीडी - स्रोत वितरण
वेब डेवलपर पुणे

16

Mb4 को charset से हटा दें और config / database.php से टकराएं, फिर यह सफलतापूर्वक निष्पादित होगा।
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',


15

लारवेल 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

मैंने एक ही समस्या का सामना किया है, और इसे अपने ऐप / डेटाबेस में नीचे दो पंक्तियों को जोड़कर तय किया है

'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
यदि आपने लारवेल में नया संस्करण स्थापित किया है। कृपया utf8mb4 और utf8mb4_unicode_ci और config / database.php से 'mb4' को हटा दें
Muthu17

13

लारवल 5.4 के लिए, बस फ़ाइल को संपादित करें

अनुप्रयोग \ प्रदाता \ 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
हालांकि यह इस सवाल का जवाब दे सकता है कि इस मुद्दे को हल करने में मदद करने के बारे में कुछ विवरण जोड़ना बेहतर होगा। कृपया पढ़ें कि मैं और अधिक जानने के लिए एक अच्छा उत्तर कैसे लिखूं
रोशन पिटिगला

6

मैं एक ही समस्या थी और मैं एक wamp का उपयोग कर रहा हूँ

समाधान: खुली फ़ाइल: config / database.php

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

धन्यवाद


पिछले उत्तरों में से किसी ने भी मेरे लिए काम नहीं किया, लेकिन इसने एक आकर्षण की तरह काम किया! और यह सही समझ में आता है, मेरा मानना ​​है कि लारवेल डीबी इंजन के पिछले संस्करणों में डिफ़ॉल्ट रूप से InnoDB पर सेट किया गया था ताकि हम पहले इन त्रुटियों का सामना न करें।
सासा ब्लागजेविक

हाँ अन्य उत्तरों की एक जोड़ी और यह भी करने की जरूरत है।
एंड्रयू

6

फ़ाइल कॉन्‍फ़िगर / database.php में:

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

इस लाइन को इसमें बदलें:

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

5

लारवेल के लिए = = 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);
   }
}

लेकिन यह दो कारणों से तुरंत काम नहीं करेगा। एक यह है कि यदि आप लार्वा के बजाय लुमेन का उपयोग कर रहे हैं, तो आपको पहले अपने ऐप में इस लाइन को अनफ़िल्ट करना पड़ सकता है।

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

और फिर आपको कारीगर कमांड के साथ फिर से माइग्रेशन स्क्रिप्ट बनानी होगी,

php artisan make:migration <your_table_name>

चूंकि अब केवल आपके द्वारा ServiceProvider में किए गए परिवर्तन ही काम करेंगे।


4

लार्वा 5.7 के लिए appserviceprovider.php में इन कोड को लिखें

  use Illuminate\Support\Facades\Schema;

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

2

बदलिए 'utf8mb4' से 'utf8' और

'utf8mb4_unicode_ci' से 'utf8_unicode_ci' तक टकराव

in config / database.php फ़ाइल

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


2

लारवेल utf8mb4डिफ़ॉल्ट रूप से सेट किए गए वर्ण का उपयोग करता है , जिसमें डेटाबेस में "इमोजीस" के भंडारण के लिए समर्थन शामिल है। यदि आप 5.7.7 रिलीज़ से पुराने MySQL का संस्करण चला रहे हैं या 10.2.2 रिलीज़ से अधिक पुराना MariaDB है, तो आपको उनके लिए अनुक्रमणिका बनाने के लिए 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


धन्यवाद, मेरे लिए काम करता है। लार्वा 5.6.23 के साथ मम्प मैक्कल
ब्लूसी

2

ऐसा इसलिए है क्योंकि लारवेल 5.4 utf8mb4 का उपयोग करता है जो भंडारण इमोजी का समर्थन करता है।

इसे अपने एप्लिकेशन \ Providers \ AppServiceProvider.php में जोड़ें

use Illuminate\Support\Facades\Schema;

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

और आपको जाना अच्छा होना चाहिए


2

यदि आप Laravel 5.4 और नवीनतम संस्करण पर अपडेट हैं या काम करते हैं;
AppServiceProvider.php में सिर्फ 1 परिवर्तन

use Illuminate\Support\Facades\Schema;

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

1

मुझे लगता है कि कुछ है कि मैं याद करना चाहते हैं ...

मैं Laravel पर नया हूँ, और मैं "उपयोग रोशन ....." कॉपी नहीं किया क्योंकि मैं सच में, atention भुगतान किया didn'at क्योंकि समारोह बूट ऊपर सही आप alread एक है उपयोग वक्तव्य।

आशा है कि किसी की मदद करता है

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

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

आप किसी भी मुखौटा के साथ केवल उपसर्ग कर सकते हैं\
ओहगोद्वी

1

मुझे एक समस्या थी, 'कॉन्फ़िगरेशन / डेटाबेस' के विन्यास को बदलना

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

डेटाबेस में एक ही पैटर्न रखते हुए।

मैंने फिर आज्ञा दी

php artisan migrate

1

24 अक्टूबर 2016 में टेलर ओटवेल के लेखक की घोषणा की ट्विटर पर है

"utf8mb4" बेहतर इमोजी समर्थन के लिए लारावेल 5.4 में डिफ़ॉल्ट MySQL चरित्र होगा। 🙌 टेलर Otwell ट्विटर पोस्ट

संस्करण 5.4 से पहले जो चरित्र सेट था utf8

इस सदी के दौरान कई वेब ऐप, अपने उपयोगकर्ताओं को बातचीत करने की अनुमति देने के लिए चैट या किसी प्रकार का मंच शामिल करते हैं, और कई लोग इमोजी या स्माइली का उपयोग करना पसंद करते हैं। और यह कुछ प्रकार के सुपर पात्र हैं जिन्हें स्टोर करने के लिए अधिक रिक्त स्थान की आवश्यकता होती है और यह केवल चारसेट केutf8mb4 रूप में उपयोग करना संभव है । यही कारण है कि वे केवल अंतरिक्ष उद्देश्य के लिए पलायन करते हैं ।utf8mb4

यदि आप Illuminate\Database\Schema\Builderकक्षा में देखते हैं, तो आप देखेंगे कि यह 255 पर$defaultStringLength सेट है , और संशोधित करने के लिए कि आप मुखौटा के माध्यम से संसाधित कर सकते हैं और विधि को कॉल कर सकते हैं और नई लंबाई पास कर सकते हैं।SchemadefaultStringLength

उस परिवर्तन को करने के लिए अपनी AppServiceProviderकक्षा के भीतर उस पद्धति को कॉल करें जो इस तरह app \ प्रदाताओं उपनिर्देशिका के तहत है

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 कैरेक्टर सेट (4-बाइट UTF-8 यूनिकोड एनकोडिंग) टेबल कॉलम काउंट और पंक्ति आकार पर सीमाएं


यह एकमात्र उत्तर है जो बताता है 191 जादू की संख्या की है।
इल्या मोस्कविन

1

उपाय:

पहले डिफ़ॉल्ट स्ट्रिंगरंग को 191 में बदलें, ऐप \ Providers \ AppServiceProvider.php में :

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

फिर, config \ database.php में निम्नानुसार वर्ण और कोलाज मान बदलें :

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

( मारियाडीबी चारसेट के बारे में जानने के लिए लिंक )


1

अपने पर जा रहे हैं config/database.phpऔर utf8mb4 से utf8 को charset और टकराव को बदलते हैं

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

इस विधि का उपयोग करके मेरी समस्या हल हो गई, सौभाग्य!


0

यदि आप MySQL 5.7.7+ या MariaDB 10.2.2+ का उपयोग कर रहे हैं तो आपको यह समस्या नहीं होगी।

Brew का उपयोग करके अपने Mac पर MariaDB अपडेट करने के लिए पहले वर्तमान को अनलिंक करें: brew unlink mariadbऔर फिर उपयोग करके एक देव स्थापित करेंbrew install mariadb --devel

इंस्टॉलेशन समाप्त होने के बाद सेवा को चालू करना / शुरू करना: brew services stop mariadb brew services start mariadb

वर्तमान देव संस्करण 10.2.3 है। इंस्टॉलेशन समाप्त होने के बाद आपको इस बारे में कोई चिंता नहीं करनी होगी और आप utf8mb4 (जो कि अब Laravel 5.4 में एक डिफ़ॉल्ट है) का उपयोग कर सकते हैं, बिना utf8 पर वापस जाए बिना और न ही AppServiceProvider को एडिट करने के लिए जैसा कि Laravel डॉक्यूमेंटेशन में प्रस्तावित है: https: // laravel .com / डॉक्स / मास्टर / रिलीज़ # लार्वा-5.4 (नीचे स्क्रॉल करें: माइग्रेशन डिफ़ॉल्ट स्ट्रिंग लंबाई )


0

बस स्थापित किया गया MariaDB 10.2.4 RC, नया खाली लारवेल 5.4 प्रोजेक्ट और डिफ़ॉल्ट माइग्रेशन (varchar (255) कॉलम) काम करता है।

डीबी कॉन्फिडेंस और लारवेल को बदलने की जरूरत नहीं है config/database.php। इस प्रकार जैसे ही @scorer ने 10.2.2+ के लिए डिफ़ॉल्ट व्यवहार के बारे में नोट किया।


0

सभी को अन्य लोगों में अच्छी तरह से वर्णित किया गया था अन्वेषक आप लिंक बलो में और अधिक विवरण देख सकते हैं (कुंजी के साथ खोजें) सूचकांक की लंबाई और MySQL / MariaDB ") https://laravel.com/docs/5.5/migrations

लेकिन यह जवाब क्या है के बारे में नहीं है! बात यह है कि ऊपर करने के साथ आप एक और त्रुटि प्राप्त करेंगे (यह तब है जब आप लॉन्च php artisan migrateकमांड पसंद करते हैं और लंबाई की समस्या के कारण, ऑपरेशन बीच में अटक गया है। समाधान बेलो है , और उपयोगकर्ता तालिका बिना बनाए बनाई गई है। बाकी या पूरी तरह से सही नहीं) हमें बेक के रोल करने की जरूरत है । डिफ़ॉल्ट रोल बैक नहीं करेगा। क्योंकि माइग्रेशन का संचालन खत्म करना पसंद नहीं करता था। आपको डेटाबेस में नए बनाए गए तालिकाओं को मैन्युअल रूप से हटाने की आवश्यकता है।

हम इसे bellow की तरह टिंकर का उपयोग कर सकते हैं:

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

यदि आपने हर दूसरे उत्तर की कोशिश की है और उन्होंने काम नहीं किया है, तो आप डेटाबेस से सभी तालिकाओं को छोड़ सकते हैं और फिर इस कमांड का उपयोग करते हुए एक साथ माइग्रेट कमांड को निष्पादित कर सकते हैं:

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