Tangani error SQLSTATE 42000 Saat Migrasi Tabel pada Larevel

Tangani error  SQLSTATE 42000 Saat Migrasi Tabel pada Larevel


Cerita dikit boleh ya mastah...!

Ceritanya gini mastah...
Saya sempat dipusingkan oleh Laravel ketika hendak memigrasi tabel ke server database (ini akibat saya kurang baca dokumen laravel). Bolak balik saya hapus tabel bahkan hapus database tidak juga berhasil.

Tabel yang akan dimigrasi:

Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email',191)->unique();
$table->string('social_id');//<--untuk login dari media sosial
$table->string('social_provider');//<--menyimpan provider media sosial seperti fb,g+
$table->string('avatar');//<-- menyimpan link gambar (avatar) dari akun media sosial

//tambahan untuk multi user
$table->enum('role',['admin','penulis','subscriber'])->default('subscriber');
//
$table->string('password');
$table->rememberToken();
$table->timestamps();
}

Error SQLSTATE 42000:

php artisan migrate
Migration table created successfully.

In Connection.php line 664:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQ
L: alter table `users` add unique `users_email_unique`(`email`))


In Connection.php line 458:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes


Setelah duduk berjam-jam akhirnya mentok juga, kemudian coba ke web laravel membaca dokumen tentang migration, dengan kemampuan bahasa inggris yang terbatas ternyata memang saya yang kurang ngeh.

Berdasarkan dokumen laravel mengatakan begini:
Index Lengths & MySQL / MariaDB
Laravel uses the utf8mb4 character set by default, which includes support for storing "emojis" in the database. If you are running a version of MySQL older than the 5.7.7 release or MariaDB older than the 10.2.2 release, you may need to manually configure the default string length generated by migrations in order for MySQL to create indexes for them. You may configure this by calling the Schema::defaultStringLength method within your AppServiceProvider
Terjemahan beebasnya:
Indeks Panjang & MySQL / MariaDB
Secara default Laravel menggunakan karakter utf8mb4, yang mencakup dukungan untuk menyimpan "emojis" dalam database. Jika Anda menggunakan MySQL versi lebih lawas 5.7.7 atau MariaDB yang lebih lawas 10.2.2, Anda mungkin perlu mengkonfigurasi secara manual panjang string default yang dihasilkan oleh migrasi agar MySQL dapat membuat indeks. Anda dapat mengkonfigurasi ini dengan memanggil metode Schema :: defaultStringLength di dalam AppServiceProvider.

Setelah saya cek server database lewat phpmyadmin ternyata benar ternyata masih menggunakan versi 10.1.19 pantes saja error, ini adalah penampakan server database saya.
Server: 127.0.0.1 via TCP/IP
Jenis server: MariaDB
Versi Server: 10.1.19-MariaDB - mariadb.org binary distribution
Versi protokol: 10
Pengguna: root@localhost
Kumpulan karakter server: UTF-8 Unicode (utf8)

Jika anda mengalami hal yang sama silahkan teruskan membaca siapa tau dapat membatu masalah anda
Ok, sekarang kita mulai:

Solusi pertama

Kurangi panjang string default pada setiap field menjadi 191, dengan cara menambahkan sedikit script berikut pada AppServiceProvider.php , file ini berada pada direktori app\Providers
Tambahkan use Illuminate\Support\Facades\Schema; tepat di bawah use Illuminate\Support\ServiceProvider; kemudian tambahkan Schema::defaultStringLength(191); di dalam function boot, hasilnya seperti ini.

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

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

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

Baru kemudian tabel yang anda miliki dimigrasi kembali.

Solusi kedua

ini mungkin cara yang paling mudah yaitu: Upgrade Server MySQL anda agar memenuhi syarat laravel 5.5 minimal menggunakan MySQL versi 5.7.7 atau MariaDB versi 10.2.2. silahkan simak video dibawah ini



Nah kalau saya ditanya milih solusi mana? saya akan memilih solusi kedua, alasannya agar dapat mengikuti perkembangan laravel. kalau anda silahkan pilih mana aja boleh hehehe...
Demikian pengalaman yang dapat saya bagikan semoga para web mastah tidak mengalami masalah seperti saya, jika toh menemui masalah seperti ini saya berharap artikel ini

Subscribe to receive free email updates:

0 Response to "Tangani error SQLSTATE 42000 Saat Migrasi Tabel pada Larevel"

Posting Komentar