লারাভেল মাইগ্রেশন: নির্দিষ্ট করা থাকলেও অনন্য কীটি অনেক দীর্ঘ


165

আমি লারাভেলে একটি ব্যবহারকারী টেবিল স্থানান্তরিত করার চেষ্টা করছি। আমি আমার স্থানান্তর চালানোর সময় আমি এই ত্রুটিটি পাই:

[আলোকসজ্জা \ ডাটাবেস \ ক্যোরিএক্সেপশন] এসকিউএলসেট [42000]: সিনট্যাক্স ত্রুটি বা অ্যাক্সেস লঙ্ঘন: 1071 নির্দিষ্ট কীটি খুব দীর্ঘ ছিল; সর্বাধিক কী দৈর্ঘ্য 767 বাইট (এসকিউএল: টেবিল পরিবর্তন করে 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');
});

কিছুটা গুগল করার পরে আমি এই বাগ রিপোর্টটি পেরিয়ে এসেছি যেখানে টেলর বলেছে যে আপনি সূচক কীটি unique()আমার দ্বিতীয় পরামিতি হিসাবে নির্দিষ্ট করতে পারবেন I এটি এখনও ত্রুটি দেয়। এখানে কি হচ্ছে?


আপনি কেন ইমেলের জন্য 320 টি অক্ষর ব্যবহার করছেন? এটি আপনার সমস্যা হতে পারে।
অ্যান্টোনিও কার্লোস রিবেইরো

1
এটি আসলে সমস্যা ছিল, কেন কোনও ধারণা নেই। তবে হ্যাঁ, আপনি ঠিক বলেছেন, আমি কেন জানি না কেন আমি প্রতিটি ক্ষেত্রের জন্য চরের দৈর্ঘ্য নির্দিষ্ট করেছি। এই সীমাগুলি সরিয়ে ফেলেছে
21:44

এটি মজাদার যে কোনও ইমেল এবং ভয়েলা-এর হ্যাশযুক্ত স্থির দৈর্ঘ্যের ক্ষেত্রটি ব্যবহার করার পরামর্শ কীভাবে দেওয়া হয়নি - সমস্যাটি চিরতরে সমাধান করা হয়, কোনও কাঠামোর জন্য এবং কোনও সম্পর্কিত ডেটাবেসের জন্য। কারণ এটির মতো আমরা স্বতন্ত্রতার গ্যারান্টি করি - সংখ্যার পরিসরটি যথেষ্ট পরিমাণে বড় (এবং sha1 / sha256 এর জন্য) এটি নির্ধারণ করে চলক-দৈর্ঘ্যের ইনপুটটির একটি নির্দিষ্ট সংখ্যার উপস্থাপনা ব্যবহার করে।
এনবি


উত্তর:


280

আপনার ই-মেইলের জন্য একটি ছোট দৈর্ঘ্য নির্দিষ্ট করুন:

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

আসলে ডিফল্ট কোনটি:

$table->string('email');

এবং আপনার ভাল হওয়া উচিত।

লারাভেল 5.4 এর জন্য আপনি এই লারাভেল 5.4-তে একটি সমাধান পেতে পারেন : নির্দিষ্ট কীটি খুব দীর্ঘ ত্রুটি ছিল, লারাভেল নিউজ পোস্ট:

এইগুলি ঠিক করার জন্য মাইগ্রেশন গাইডে বর্ণিত হিসাবে আপনাকে যা করতে হবে তা হ'ল আপনার অ্যাপসোসেসপ্রোভিডার.এফপি ফাইলটি সম্পাদনা করা এবং বুট পদ্ধতির অভ্যন্তরে একটি ডিফল্ট স্ট্রিং দৈর্ঘ্য সেট করা:

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
অ্যাপসোসভারপ্রোভিডার.এফপি-তে কনফিগারেশন তৈরি করার পরে, এই সমস্যাটি এখনও চলছে। আমি শুধু বিভ্রান্ত কেন? আমি সার্ভার, ডাটাবেস এবং সমস্ত কিছু আবার শুরু করেছি। সাহায্য করুন.
কৌশিক দাস

3
আপনাকে 767 বাইটের সীমা অনুসারে সূচিযুক্ত কলামটির দৈর্ঘ্য নির্ধারণ করতে হবে। সচেতন থাকুন যে ভর্চারে প্রতিটি দৈর্ঘ্যের ইউনিটের জন্য 1, 2 বা 4 বাইট থাকতে পারে। উদাহরণ: utf8_mb4 (4 বাইট) -> 767/4 = 191. অন্যথায় এক্স <85 (1 বাইট) = ও (85) সহ ভ্রচার (এক্স) এর জন্য utf8_general_ci, অথবা এক্স> = 86 (2) এর সাথে Vਰਚবার (এক্স) এর জন্য utf8_general_ci বাইটস) -> 767/2 = 383. একাধিক কলাম সূচীতে অন্যান্য কলামগুলিও দৈর্ঘ্য বিবেচনা করুন।
জ্যাকি Degl'Innocenti

2
আপনি সমস্ত স্ট্রিং কলামগুলির জন্য একটি ডিফল্ট দৈর্ঘ্য নির্দিষ্ট করে মাইগ্রেশন ফাইলগুলিতে নির্দিষ্ট কলামের দৈর্ঘ্যটি সরাসরি সম্পাদনা করতে চাইতে পারেন, কারণ কোনও কলামের কোনও সূচীতে না থাকার কারণে সমস্ত কলামকে এই সীমাবদ্ধতার প্রয়োজন হবে না। $ table-> স্ট্রিং ( 'COLUMN_NAME', 191);
জ্যাকি Degl'Innocenti

109

আপডেট 1

লারাভেল 5.4 হিসাবে এই পরিবর্তনগুলির আর দরকার নেই।

লারাভেল 5.4 ডিফল্ট হিসাবে সেট করা utf8mb4 অক্ষর ব্যবহার করে, যার মধ্যে ডাটাবেসে "ইমোজিস" সংরক্ষণ করার জন্য সমর্থন অন্তর্ভুক্ত রয়েছে। আপনি যদি লারাভেল 5.3 থেকে আপনার অ্যাপ্লিকেশনটি আপগ্রেড করছেন তবে আপনাকে এই অক্ষর সেটটিতে স্যুইচ করতে হবে না।

আপডেট 2

বর্তমান উত্পাদন মারিয়াডিবি সংস্করণগুলি বিশ্বব্যাপী ডিফল্টরূপে এই সেটিংটি সমর্থন করে না । এটি ডিফল্টভাবে মারিয়াডিবি 10.2.2+ এ প্রয়োগ করা হয়েছে ।

সমাধান

এবং আপনি যদি ইচ্ছাকৃতভাবে সঠিক ভবিষ্যত-ডিফল্ট (লারাভেল 5.4 থেকে শুরু করে) ইউটিএফ 8 মাল্টি-বাইট utf8mb4সমর্থন 😀 তারপরে ঠিক করতে শুরু করুন 😂 আপনার ডাটাবেস কনফিগারেশনটি ব্যবহার করতে চান।

লারাভেল config/database.phpসংজ্ঞায়িত:

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',

DYNAMICদীর্ঘ কী সূচকগুলি সংরক্ষণ করতে দেয় ।

সার্ভার সেটিংস (ডিফল্টরূপে মাইএসকিউএল 5.7.7+ / মারিয়াডবি 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

এবং তারপরে আপনার মাইএসকিউএল / মারিয়াডিবি সার্ভারটি বন্ধ করুন। তারপরে শুরু। হট রিস্টার্ট কাজ নাও করতে পারে।

sudo systemctl stop mysqld
sudo systemctl start mysqld

এখন আপনার কাছে ইউটিএফ 8 সমর্থন সহ লারাভেল 5.x রয়েছে।


3
এটি মাইএসকিউএল 5.5 এর সাথে যথেষ্ট পরিমাণে জাগতে পারে (পুনরায় কনফিগার করার চেষ্টা করেনি)। 5.7 (সম্ভবত 5.6) কোনও পুনর্গঠনের প্রয়োজন ছাড়াই কাজ করেছে। 5.7 ভ্যানিলা কনফিগারেশন সহ একটি ডিফল্ট সম্প্রদায় সার্ভার বিতরণ ছিল।
Pjotr

আপনি উল্লিখিত হিসাবে আমি আমার ডাটাবেস.এফপিতে ইঞ্জিনটি পরিবর্তন করেছি তবে এটি এখনও সারি = কমপ্যাক্ট সহ টেবিল তৈরি করছে যা সমস্যার সৃষ্টি করছে। আমি পুরোপুরি বুঝতে পারি নি, আপনি কি বলছেন যে এটি ডাটাবেস.এফপি পরিবর্তন করার পক্ষে যথেষ্ট নয় এবং এটিও আমার সিএনএফ ফাইলটিতে পরিবর্তন করা দরকার?
ভাস্পেরকাইটে

এটি কেবল database.phpকনফিগার ফাইলে পরিবর্তন করা যথেষ্ট এবং এটি স্থানীয় লারাভেল প্রকল্পকে প্রভাবিত করবে। deleteপরিবর্তনগুলি করার আগে ডাটাবেসে নিশ্চিত হয়ে নতুন সেটিংসের সাহায্যে এটি তৈরি করুন। আপনাকে my.cnfকেবলমাত্র বিশ্বব্যাপী সার্ভারের পার্শ্ব পরিবর্তনের জন্য কনফিগার ফাইল পরিবর্তন করতে হবে (বর্তমানে সমস্ত নতুন ইনস্টলেশন ব্যবহৃত হচ্ছে utf8mb4)।
স্কোরার

অথবা - অন্য ক্ষেত্র যুক্ত করুন, ইমেলের হ্যাশ গণনা করুন, ক্ষেত্রটিকে অনন্য করুন, চিরকালের সমস্যাটি সমাধান করুন, ডাটাবেস সূচনা ভেরিয়েবলগুলির সাথে ফিডিং এড়ান।
এনবি

যদি কেউ মতবাদ 2 ব্যবহার করে থাকে তবেoptions={"row_format"="DYNAMIC"} আপনি আপনার @Tableটীকাটি পেরিয়ে ROW_FORMAT সেট করতে পারেন ।
Albert221

50

আপনি যদি লারাভেল 5.4 এ থাকেন বা আপডেট হন তবে এটি আমার পক্ষে কাজ করেছে;

মাত্র 1 পরিবর্তন। অ্যাপসোসভারপ্রভাইডার.এফপি এ

use Illuminate\Support\Facades\Schema;

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

স্থানান্তর গাইড https://laravel.com/docs/master/migration#creating-indexes এ উল্লিখিত হিসাবে


আমি মাইগ্রেশনে নিজেই এটি করেছি।
আমিরমসৌদ

7
এটি (সম্ভবত) কারণ প্রতিটি অক্ষর ঠিক 4 বাইট নেয়, এবং সর্বাধিক কী দৈর্ঘ্য বাইটে পরিমাপ করা হয়, অক্ষর নয়। সুতরাং মূল দৈর্ঘ্য 191 * 4 = 764 বাইট দ্বারা হবে, সর্বোচ্চ 767 বাইটের অধীনে একটি স্মিডজেন ডাটাবেস সমর্থন করবে। সমাধানগুলি ব্যাখ্যার প্রয়োজন IMO যদি তারা এখানে ভাগ করে নেওয়া জ্ঞানে অবদান রাখে, এবং কেবল "পদ্ধতি" সরবরাহ করে না। তবে একটি সহজ ফিক্স।
জেসন

33

অন্য কেউ যদি এই উত্তরের জন্য হোঁচট খায় যেমন আমি করেছিলাম তবে অন্য কারণে, আপনি আপনার লারাভেল ডিবি চরসেট / কোলেশন পরীক্ষা করতে পারেন।

আমি একটি অ্যাপ্লিকেশন ইনস্টল করছিলাম (স্নাইপ-আইটি) এবং নিম্নলিখিতগুলি ব্যবহার করার জন্য লারাভেল ডাটাবেস কনফিগার করেছিলাম:

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

সরানো হচ্ছে mb4উভয় স্ট্রিং সমস্যা সংশোধন থেকে, যদিও আমি বিশ্বাস করি Antonio এর উত্তর সমস্যার বাস্তব সমাধান।


21

এটি আমার পক্ষে কাজ করেছে:

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


এটি আমার পক্ষে কাজ করেছে। আমি সার্ভার সংস্করণ ব্যবহার করি: 10.1.22-মারিয়াডিবি - উত্স বিতরণ
পুনেতে ওয়েব বিকাশকারী

16

চরসেট থেকে এমবি 4 মুছে ফেলুন এবং কনফিগারেশন / ডাটাবেস.এফপি থেকে কোলেশন করুন, তবে এটি সফলভাবে কার্যকর হবে।
'চরসেট' => 'utf8',
'কোলেশন' => '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

আমি একই সমস্যার মুখোমুখি হয়েছি এবং আমার অ্যাপ / ডাটাবেস.এফপিতে নীচের দুটি লাইন যুক্ত করে এটি ঠিক করেছি

'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' সরান
মুথু ১

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

আমারও একই সমস্যা ছিল এবং আমি একটি ল্যাম্প ব্যবহার করছি

সমাধান: ফাইল খুলুন: কনফিগারেশন / ডাটাবেস.এফপি

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

ধন্যবাদ


পূর্ববর্তী উত্তরগুলির কোনওটিই আমার পক্ষে কাজ করেনি, তবে এটি একটি কবজির মতো কাজ করেছে! এবং এটি সঠিক ধারণা দেয়, আমি বিশ্বাস করি লারাভেল ডিবি ইঞ্জিনের পূর্ববর্তী সংস্করণগুলিকে ডিফল্টরূপে ইনোডিবিতে সেট করা হয়েছিল যাতে আমরা আগে এই ত্রুটিগুলির মুখোমুখি হই নি।
সাসা ব্লগোজেভিক

হ্যাঁর অন্যান্য উত্তরগুলিও বেশ কয়েকটি করা দরকার এবং এটিও।
অ্যান্ড্রু

6

ফাইল কনফিগারেশন / ডাটাবেস.এফপি যেখানে:

'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);
   }
}

তবে এটি দুটি কারণে এখনই কাজ করবে না। একটি হ'ল যদি আপনি লারাভেলের পরিবর্তে লুমেন ব্যবহার করেন তবে আপনাকে প্রথমে আপনার অ্যাপ.পিএইচপি ফাইলটিতে এই লাইনটি অসুবিধে করতে হতে পারে।

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

এবং তারপরে আপনাকে আবার কারিগর কমান্ড দিয়ে মাইগ্রেশন স্ক্রিপ্ট তৈরি করতে হবে,

php artisan make:migration <your_table_name>

যেহেতু এখন থেকে আপনি সার্ভিসপ্রাইভাইডারে করা পরিবর্তনগুলি কাজ করবে।


4

লারাভেল ৫. for এর জন্য এ কোডগুলি অ্যাপসারাইসপ্রোভাইডার.এফপিতে লিখুন

  use Illuminate\Support\Facades\Schema;

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

2

চরসেটটি 'utf8mb4' থেকে 'utf8' তে পরিবর্তন করুন এবং

'utf8mb4_unicode_ci' থেকে 'utf8_unicode_ci' তে কোলেশন

কনফিগারেশন / ডাটাবেস.এফপি ফাইল

এটা আমার জন্য কাজ করেছে।


2

লারাভেল utf8mb4ডিফল্টরূপে নির্ধারিত অক্ষরটি ব্যবহার করে , যা ডাটাবেসে "ইমোজিস" সংরক্ষণের জন্য সমর্থন অন্তর্ভুক্ত করে। আপনি যদি মাইএসকিউএলের একটি সংস্করণ 5.7.7 রিলিজের চেয়ে পুরানো বা 10.2.2 রিলিজের চেয়ে পুরানো মারিয়াডিবি থেকে চালাচ্ছেন তবে মাইএসকিউএলের জন্য সূচী তৈরি করতে আপনাকে মাইগ্রেশন দ্বারা উত্পন্ন ডিফল্ট স্ট্রিং দৈর্ঘ্যটি ম্যানুয়ালি কনফিগার করতে হবে। 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/migration#indexes


ধন্যবাদ, আমার জন্য কাজ করে। লারাভেল 5.6.23 এর সাথে ম্যাম্প মাইএসকিএল
ব্লুস্কি

2

এর কারণ লারাভেল 5.4 ইউটিফ 8 এমবি 4 ব্যবহার করে যা ইমোজিগুলি সঞ্চয় করার পক্ষে সমর্থন করে।

এটি আপনার অ্যাপ্লিকেশন \ সরবরাহকারী \ অ্যাপসোসভারপ্রভাইডার.এফপি এ যুক্ত করুন

use Illuminate\Support\Facades\Schema;

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

এবং আপনি যেতে ভাল করা উচিত।


2

যদি আপনি লারাভেল 5.4 এবং সর্বশেষ সংস্করণে আপডেট হন বা এটি আপডেট হয়;
অ্যাপসোসভারপ্রভাইডার.পিপিতে মাত্র 1 পরিবর্তন

use Illuminate\Support\Facades\Schema;

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

1

আমি এটি উল্লেখ করতে চাই যা আমি মিস করেছি ...

আমি Laravel নতুন, এবং আমি "ব্যবহার জ্বালান ....." কপি করা হয়নি কারন আমি সত্যিই, মনোযোগ প্রদান করা 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 এ সেট করা ডিফল্ট মাইএসকিউএল অক্ষর হবে। 🙌 টেলর ওটওয়েল টুইটার পোস্ট

যা সংস্করণ 5.4 এর আগে অক্ষর সেট ছিল utf8

এই শতাব্দীতে অনেক ওয়েব অ্যাপ্লিকেশন, তাদের ব্যবহারকারীদের কথোপকথনের অনুমতি দেওয়ার জন্য চ্যাট বা কোনও ধরণের প্ল্যাটফর্ম অন্তর্ভুক্ত করে এবং অনেক লোক ইমোজি বা স্মাইলি ব্যবহার করতে পছন্দ করে। এবং এই যে আরো শূণ্যস্থান দোকান হতে প্রয়োজন এবং যে ব্যবহার করে শুধুমাত্র সম্ভব সুপার অক্ষরের কিছু ধরনের utf8mb4যেমন অক্ষরসেট । এ কারণেই তারা utf8mb4কেবল স্থান উদ্দেশ্যে for

আপনি যদি 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 মান হিসাবে কেবল মাইএসকিউএল সমর্থন হিসাবে 767 বাইট সমর্থন করার পরামর্শ দিতে হবে , এবং 767 / 4এটি প্রতিটি মাল্টিবাইট চরিত্র দ্বারা প্রাপ্ত বাইট সংখ্যা যা আপনি পাবেন 191

আপনি এখানে আরও শিখতে পারেন utf8mb4 অক্ষর সেট (4-বাইট UTF-8 ইউনিকোড এনকোডিং) সারণী কলামের গণনা এবং সারি আকারের সীমা


এটিই একমাত্র উত্তর যা 191ম্যাজিক সংখ্যাটি ব্যাখ্যা করে ।
ইলিয়া মোসকভিন

1

সমাধান:

প্রথমে ডিফল্ট স্ট্রিং লেংথটি 191 এ পরিবর্তন করুন, অ্যাপ্লিকেশন \ সরবরাহকারী \ অ্যাপসোসিয়েশনপ্রোভিডার.এফপি :

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

তারপরে, কনফিগার \ ডাটাবেস.এফপি-তে নিম্নলিখিতভাবে চরসেট এবং কোলেশন মানগুলি পরিবর্তন করুন :

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

( মারিয়াডিবি চরসেট সম্পর্কে জানতে লিঙ্ক )


1

আপনার কাছে config/database.phpগিয়ে চরসেট এবং কোলেশনটি utf8mb4 থেকে utf8 এ পরিবর্তন করুন

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

এই সমস্যাটি ব্যবহার করে আমার সমস্যা সমাধান হয়েছে, শুভকামনা!


0

আপনি মাইএসকিউএল 5.7.7+ বা মারিয়াডিবি 10.2.2+ ব্যবহার করছেন তবে আপনার এই সমস্যা হবে না।

ব্রু ব্যবহার করে আপনার ম্যাকের উপর মারিয়াডিবি আপডেট করতে প্রথমে বর্তমানটিকে লিঙ্ক করুন: brew unlink mariadbএবং তারপরে একটি ডেভ ইনস্টল করুনbrew install mariadb --devel

ইনস্টলেশন সমাপ্ত হওয়ার পরে / পরিষেবাটি চালু হওয়া শুরু করুন: brew services stop mariadb brew services start mariadb

বর্তমান দেব সংস্করণ 10.2.3। ইনস্টলেশন সমাপ্ত হওয়ার পরে আপনাকে আর এটি নিয়ে চিন্তা করতে হবে না এবং আপনি utf8mb4 ব্যবহার করতে পারবেন (এটি এখন লারভেল 5.4 এ একটি ডিফল্ট) ইউটিএফ 8 এ স্যুইচ না করে বা ল্যাপার ডকুমেন্টেশনে প্রস্তাবিত অ্যাপসোসেসপ্রাইভাইডার সম্পাদনা না করেই ব্যবহার করতে পারেন: https: // লারাভেল .com / ডকস / মাস্টার / রিলিজ # লারাভেল -5.4 (এখানে স্ক্রোল করুন: মাইগ্রেশন ডিফল্ট স্ট্রিং দৈর্ঘ্য )


0

সবেমাত্র মারিয়াডিবি 10.2.4 আরসি ইনস্টল করা হয়েছে, নতুন ফাঁকা লারাভেল 5.4 প্রকল্প এবং ডিফল্ট মাইগ্রেশন (বারচর (255) কলাম) কাজ আপ করে দিয়েছে।

ডিবি কনফ এবং লারাভেল পরিবর্তন করার দরকার নেই config/database.php। এইভাবে @ স্কোর 10.2.2+ এর জন্য ডিফল্ট আচরণ সম্পর্কে উল্লেখ করেছেন।


0

সমস্ত অন্যান্যদের মধ্যে ভালভাবে বর্ণনা করা হয়েছিল আনসার আপনি লিঙ্ক বেলোতে আরও বিশদটি দেখতে পারেন (কী 'সূচক দৈর্ঘ্য এবং মাইএসকিউএল / মারিয়াডিবি "দিয়ে অনুসন্ধান করুন) https://laravel.com/docs/5.5/migration

তবে এই উত্তরটি কী তা নয়! জিনিসটি উপরেরটি করার পরেও আপনি অন্য একটি ত্রুটি পেতে পছন্দ করবেন (এটি যখন আপনি লঞ্চ php artisan migrateকমান্ড পছন্দ করেন এবং দৈর্ঘ্যের সমস্যার কারণে, অপারেশনটি মাঝখানে আটকে যাওয়ার মতো হয় solution সমাধানটি প্রশংসনীয় , এবং ব্যবহারকারীর টেবিলটি তৈরি না করেই তৈরি করা হয়) বাকি না পুরোপুরি সঠিকভাবে নয়) আমাদের বেক কে রোল করতে হবে । ডিফল্ট রোল ফিরে না। কারণ মাইগ্রেশন অপারেশন সমাপ্তি পছন্দ করেনি। আপনাকে ডাটাবেসে নতুন তৈরি টেবিলগুলি ম্যানুয়ালি মুছে ফেলতে হবে।

আমরা এটি টিউঙ্কার ব্যবহার করে বেলো হিসাবে করতে পারি:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.