اذهب إلى المحتوى
  • 0

خطأ Specified key was too long في Laravel

Mahmoud Alrashidi

السؤال

أحاول تهجير ملف users لكن عند تنفيذ أمر التهجير يُعطي الخطأ التالي:

[Illuminate\Database\QueryException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique 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');
});

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

سبب الخطأ هو أن لارافيل في النسخة 5.4 أحدثت تغييراً في الترميز الافتراضي المستخدم في قواعد البيانات وأصبح utf8mb4 والذي يدعم تخزين الemojis.

وهذا الخطأ أصبح يظهر فقط مع المشاريع المبنية على النسخ الأحدث من 5.4 والتي مازالت تستخدم نسخ أقدم من mysql5.7.7

ولذلك في حال كنت تستخدم mariadb أو نسخ أقم سيظهر هذا الخطأ لديك والحل هو بالطبع بتحديث النسختين في كل من لارافيل و قاعدة البيانات.

ولكن يوجد حل مؤقت يمكنك تنفيذه في كل مشروع، بالتوجه إلى AppServiceProvider.php ثم بداخل التابع boot نقوم بتعديل defaultStringLength في لارافيل كالتالي:

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

وبالطبع لا ننسى إضافة تضمين الschema في نفس الملف:

use Illuminate\Support\Facades\Schema;

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

هناك ايضا طرق أخرى منها, تغيير Migration Length إلى 191 مثل

$table->string('name', 191);

أو من ملف AppServiceProvider.php في دالة Boot يمكنك إضافة التالية 

\Illuminate\Support\Facades\Schema::defaultStringLength(191);

فتصبح 

public function boot()
{
    \Illuminate\Support\Facades\Schema::defaultStringLength(191);
}

إذا كنت لا تهتم بـ utf8mb4 , يمكنك الانتقال إلى ملف config / database.php واستبدال charset و collation بـ utf8

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

تصبح 

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

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...