Saya mencoba memigrasi tabel pengguna di Laravel. Ketika saya menjalankan migrasi saya, saya mendapatkan kesalahan ini:
[Illuminate \ Database \ QueryException] SQLSTATE [42000]: Kesalahan sintaksis atau pelanggaran akses: 1071 Kunci yang ditentukan terlalu panjang; panjang kunci maks adalah 767 byte (SQL: alter table
users
add unique users_email_uniq (
migrasi saya adalah sebagai berikut:
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');
});
Setelah beberapa googling saya menemukan laporan bug ini di mana Taylor mengatakan Anda dapat menentukan kunci indeks sebagai parameter ke-2 unique()
, yang telah saya lakukan. Itu masih memberi kesalahan. Apa yang terjadi disini?
Jawaban:
Tentukan panjang yang lebih kecil untuk email Anda:
Yang merupakan default, sebenarnya:
Dan kamu harus baik.
Untuk Laravel 5.4 Anda dapat menemukan solusi dalam Laravel 5.4 ini: Kunci yang ditentukan adalah kesalahan yang terlalu panjang, Laravel News post:
Seperti yang diuraikan dalam panduan Migrasi untuk memperbaikinya, yang harus Anda lakukan adalah mengedit file AppServiceProvider.php Anda dan di dalam metode boot, tentukan panjang string default:
sumber
254
mungkin patut diingat, jadi saya mungkin akan memvalidasi keunikan menggunakan validator dalam kasus itu.\Illuminate\Database\Schema\Builder::defaultStringLength(191);
untuk jalur referensi fungsi yang benarPerbarui 1
Pada Laravel 5.4, perubahan itu tidak diperlukan lagi.
Perbarui 2
Versi produksi MariaDB saat ini TIDAK mendukung pengaturan ini secara default secara global. Ini diterapkan di MariaDB 10.2.2+ secara default .
Larutan
Dan jika Anda ingin menggunakan masa depan-standar yang benar (mulai dari Laravel 5.4)
utf8mb4
dukungan multi-byte UTF8 untuk 😀 maka mulailah untuk memperbaiki configuration konfigurasi basis data Anda.Dalam Laravel
config/database.php
define:DYNAMIC
memungkinkan untuk menyimpan indeks kunci yang panjang .Pengaturan server (secara default termasuk dalam MySQL 5.7.7+ / MariaDB 10.2.2+):
Untuk klien:
Dan kemudian BERHENTI server MySQL / MariaDB Anda. Setelah itu MULAI. Hot RESTART mungkin tidak berfungsi.
Sekarang Anda memiliki Laravel 5.x dengan dukungan UTF8.
sumber
database.php
file konfigurasi dan itu akan berdampak pada proyek Laravel lokal. Pastikan untukdelete
membuat basis data sebelum membuat perubahan dan membuatnya dengan pengaturan baru. Anda perlu mengubahmy.cnf
file konfigurasi hanya untuk perubahan sisi server global (saat ini semua instalasi baru menggunakanutf8mb4
).options={"row_format"="DYNAMIC"}
Anda@Table
.Jika Anda menggunakan atau memperbarui ke Laravel 5.4 Ini bekerja untuk saya;
Hanya 1 perubahan. di AppServiceProvider.php
Seperti disebutkan dalam panduan migrasi https://laravel.com/docs/master/migrations#creating-indexes
sumber
Jika orang lain menemukan jawaban ini seperti yang saya lakukan tetapi untuk alasan yang berbeda, Anda dapat memeriksa charset / collation Laravel DB Anda.
Saya menginstal aplikasi (Snipe-IT) dan telah mengkonfigurasi konfigurasi database Laravel untuk menggunakan yang berikut:
Menghapus
mb4
dari kedua string memperbaiki masalah, meskipun saya percaya jawaban Antonio adalah solusi nyata untuk masalah tersebut.sumber
Ini bekerja untuk saya:
sumber
Hapus mb4 dari charset dan collation dari config / database.php, maka itu akan berhasil dijalankan.
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
sumber
Untuk laravel 5.6
Solusi ini menyelesaikan masalah saya,
buka
config/database.php
Cari kode di bawah ini
Ubah dua bidang ini
Dengan ini
sumber
Saya telah menghadapi masalah yang sama, dan memperbaikinya dengan menambahkan dua baris di bawah ini di app / database.php saya
File saya terlihat seperti di bawah ini:
sumber
Untuk laravel 5.4, cukup edit file
sumber
sumber
Saya punya masalah yang sama dan saya menggunakan wamp
Solusi: Buka file: config / database.php
Terima kasih
sumber
Dalam file config / database.php di mana:
Ubah baris ini menjadi ini:
sumber
Untuk Laravel> = 5.6 pengguna
Buka
AppServiceProvider.php
fileGunakan kelas berikut
Kemudian di dalam
boot
metode tambahkan baris berikutsumber
Saya menambahkan ke migrasi itu sendiri
ya, saya tahu saya harus mempertimbangkannya pada setiap migrasi tapi saya lebih suka daripada menyimpannya di beberapa penyedia layanan yang sama sekali tidak terkait
sumber
Jika seseorang mengalami masalah ini bahkan setelah melakukan, perubahan yang disebutkan di atas. Sebagai contoh, dalam kasus saya, saya melakukan perubahan di bawah ini,
Tapi itu tidak akan berhasil karena dua alasan. Salah satunya adalah jika Anda menggunakan lumen alih-alih laravel, Anda mungkin harus menghapus komentar baris ini di file app.php Anda terlebih dahulu.
Dan kemudian Anda harus membuat skrip migrasi lagi dengan perintah artisan,
Karena sekarang hanya perubahan yang Anda buat pada ServiceProvider yang akan berfungsi.
sumber
untuk laravel 5.7 tulis kode ini di appserviceprovider.php
sumber
Ubah charset dari 'utf8mb4' ke 'utf8' dan
susun ke 'utf8mb4_unicode_ci' ke 'utf8_unicode_ci'
dalam file config / database.php
Ini berhasil untuk saya.
sumber
Laravel menggunakan
utf8mb4
karakter yang ditetapkan secara default, yang mencakup dukungan untuk menyimpan "emoji" dalam database. Jika Anda menjalankan versi MySQL yang lebih lama dari rilis 5.7.7 atau MariaDB yang lebih lama dari rilis 10.2.2, Anda mungkin perlu mengkonfigurasi secara manual panjang string default yang dihasilkan oleh migrasi agar MySQL dapat membuat indeks untuk mereka. Anda dapat mengonfigurasikan ini dengan memanggilSchema::defaultStringLength
metode di dalamAppServiceProvider
:Anda bisa keluar
https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes
sumber
Itu karena Laravel 5.4 menggunakan utf8mb4 yang mendukung penyimpanan emoji.
Tambahkan ini di aplikasi Anda \ Providers \ AppServiceProvider.php
dan kamu harus baik untuk pergi.
sumber
Jika Anda menggunakan atau diperbarui ke Laravel 5.4 dan versi terbaru berfungsi;
Hanya 1 perubahan di AppServiceProvider.php
sumber
Saya ingin menunjukkan sesuatu yang saya lewatkan ...
Saya baru di Laravel, dan saya tidak menyalin "gunakan Illuminate ....." karena saya benar-benar tidak memperhatikan, karena tepat di atas fungsi boot yang telah Anda gunakan. Pernyataan .
Semoga itu bisa membantu siapa saja
sumber
\
Saya punya masalah, ubah konfigurasi 'config / database'
menjaga pola yang sama di dalam basis data.
Saya kemudian memberi perintah
sumber
Pada 24 Oktober 2016 Taylor Otwell , Pengarang Laravel yang diumumkan di Twitter
yang sebelum versi 5.4 set karakter
utf8
Selama abad ini banyak aplikasi web, termasuk obrolan atau semacam platform untuk memungkinkan penggunanya melakukan percakapan, dan banyak orang suka menggunakan emoji atau smiley. dan ini adalah semacam karakter super yang membutuhkan lebih banyak ruang untuk disimpan dan itu hanya mungkin digunakan
utf8mb4
sebagai charset . Itulah alasan mengapa mereka bermigrasiutf8mb4
hanya untuk tujuan ruang.jika Anda mencari di
Illuminate\Database\Schema\Builder
kelas Anda akan melihat bahwa$defaultStringLength
diatur ke 255 , dan untuk memodifikasi bahwa Anda dapat melanjutkan melaluiSchema
Facade dan memanggildefaultStringLength
metode dan melewati panjang baru.untuk melakukan perubahan itu panggil metode itu di dalam
AppServiceProvider
kelas Anda yang berada di bawah subdirektori app \ provider seperti iniSaya akan menyarankan untuk menggunakan 191 sebagai nilai hanya karena MySQL mendukung 767 byte, dan karena
767 / 4
yang merupakan jumlah byte yang diambil oleh setiap karakter multibyte Anda akan mendapatkan191
.Anda dapat mempelajari lebih lanjut di sini Set Karakter utf8mb4 (Encoding Unicode UTF-8 4-Byte) Batas pada Jumlah Kolom Tabel dan Ukuran Baris
sumber
191
ajaib.LARUTAN:
Pertama-tama ubah defaultStringLength menjadi 191, di app \ Providers \ AppServiceProvider.php :
Lalu, ubah nilai rangkaian karakter dan susunan sebagai berikut, di config \ database.php :
( tautan untuk mengetahui tentang rangkaian karakter MariaDB )
sumber
Pergi ke Anda
config/database.php
dan ubah charset dan collation dari utf8mb4 ke utf8Masalah saya terpecahkan dengan menggunakan metode ini, selamat mencoba Bung!
sumber
Anda tidak akan memiliki masalah ini jika Anda menggunakan MySQL 5.7.7+ atau MariaDB 10.2.2+.
Untuk memperbarui MariaDB di Mac Anda menggunakan Brew terlebih dahulu putuskan tautan yang sekarang:
brew unlink mariadb
dan kemudian instal yang menggunakanbrew install mariadb --devel
Setelah instalasi selesai, hentikan / mulai menjalankan layanan:
brew services stop mariadb brew services start mariadb
Versi dev saat ini adalah 10.2.3. Setelah instalasi selesai Anda tidak perlu khawatir tentang ini lagi dan Anda dapat menggunakan utf8mb4 (yang sekarang menjadi default di Laravel 5.4) tanpa beralih kembali ke utf8 atau mengedit AppServiceProvider seperti yang diusulkan dalam dokumentasi Laravel: https: // laravel .com / docs / master / rilis # laravel-5.4 (gulir ke bawah ke: Panjang String Default Migrasi )
sumber
Baru saja menginstal MariaDB 10.2.4 RC, menjalankan kolom proyek Laravel 5.4 baru dan migrasi default (varchar (255)).
Tidak perlu mengubah DB conf dan Laravael
config/database.php
. Demikian seperti yang dicatat oleh @scorer tentang perilaku default untuk 10.2.2+.sumber
Semua dijelaskan dengan baik di Anwser yang lain, Anda dapat melihat lebih detail di tautan di bawah (cari dengan kunci 'Panjang Indeks & MySQL / MariaDB ") https://laravel.com/docs/5.5/migrations
TAPI BAIK ITU bukan tentang apa jawaban ini! masalahnya adalah bahkan dengan melakukan hal di atas Anda akan suka mendapatkan kesalahan lain (saat itulah Anda suka meluncurkan
php artisan migrate
perintah dan karena masalah panjangnya, operasi seperti macet di tengah. solusinya di bawah , dan tabel pengguna seperti dibuat tanpa sisanya atau tidak sepenuhnya benar) kita perlu roll bac k. rollback default tidak akan berfungsi. karena operasi migrasi tidak suka selesai. Anda perlu menghapus tabel yang baru dibuat dalam database secara manual.kita bisa melakukannya menggunakan tinker seperti di bawah ini:
Saya sendiri punya masalah dengan tabel pengguna.
setelah itu bagus kamu pergi
sumber
Setel mesin basis data InnoDB:
sumber
Jika Anda telah mencoba setiap jawaban lain dan mereka tidak berfungsi, Anda dapat menghapus semua tabel dari database dan kemudian menjalankan perintah migrasi sekaligus menggunakan perintah ini:
sumber