Kesalahan migrasi pada Laravel 5.4 dengan php artisan make:auth
[Illuminate \ Database \ QueryException] SQLSTATE [42000]: Kesalahan sintaksis atau pelanggaran akses: 1071 Kunci yang ditentukan terlalu panjang; panjang kunci maks adalah 767 byte (SQL: alter tabl e
users
add uniqueusers_email_unique
([PDOException] SQLSTATE [42000]: Kesalahan sintaksis atau pelanggaran akses: 1071 Kunci yang ditentukan terlalu panjang; panjang kunci maks adalah 767 byte
Jawaban:
Menurut dokumentasi resmi , Anda dapat menyelesaikan ini dengan mudah.
Tambahkan dua baris kode berikut ke AppServiceProvider.php (/app/Providers/AppServiceProvider.php)
sumber
Saya tidak tahu mengapa solusi di atas dan solusi resmi yang ditambahkan
di
AppServiceProvider
tidak bekerja untuk saya. Apa yang berhasil adalah mengeditdatabase.php
file diconfig
folder. Cukup edituntuk
dan itu akan berfungsi, meskipun Anda tidak akan dapat menyimpan karakter multibyte yang diperluas seperti emoji .
Saya melakukannya dengan Laravel 5.7. Semoga ini bisa membantu.
sumber
use Illuminate\Support\Facades\Schema;
di atas.utf8mb4
pemeriksaan ada karena suatu alasan, saya sarankan untuk menggunakannya jika Anda bisa.Saya hanya menambahkan jawaban ini di sini karena itu
quickest
solusi bagi saya. Cukup setel mesin database default ke'InnoDB'
on/config/database.php
kemudian jalankan
php artisan config:cache
untuk menghapus dan menyegarkan cache konfigurasisumber
Dalam
AppServiceProvider.php
, Anda memasukkan kode ini di bagian atas file.sumber
Masalah ini disebabkan di Laravel 5.4 oleh versi database.
Menurut dokumen (di
Index Lengths & MySQL / MariaDB
bagian):Dengan kata lain, di
<ROOT>/app/Providers/AppServiceProvider.php
:Tetapi seperti komentar pada jawaban lain mengatakan:
Jadi dokumentasi juga mengusulkan solusi lain:
sumber
Untuk seseorang yang tidak ingin berubah
AppServiceProvider.php
. (Menurut saya, itu ide buruk untuk berubahAppServiceProvider.php
hanya untuk migrasi)Anda dapat menambahkan kembali panjang data ke file migrasi
database/migrations/
seperti di bawah ini:create_users_table.php
create_password_resets_table.php
sumber
Jika Anda menghadapi kesalahan ini saat bekerja di laravel saat menggunakan perintah:
php artisan migrate
maka Anda hanya menambahkan 2 baris dalam file: app-> Providers-> AppServiceProvider.phpuse Schema;
Schema::defaultStringLength(191);
silakan periksa gambar ini . lalu jalankan
php artisan migrate
perintah lagi.sumber
\Schema::defaultStringLength(191);
Saya menambahkan dua solusi yang bekerja untuk saya.
Solusi pertama adalah :
Edit
'engine' => null,
ke'engine' => 'InnoDB',
Ini berhasil untuk saya.
Solusi kedua adalah:
Buka file database.php insde config dir / folder.
2. Edit
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
ke
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Semoga berhasil
sumber
perbarui & sisipkan baris ini di app / Penyedia / AppServiceProvider.php
sumber
Saya telah memecahkan masalah ini dan mengedit file config-> database.php agar menyukai database saya ('charset' => 'utf8') dan ('collation' => 'utf8_general_ci') , jadi masalah saya adalah memecahkan kode sebagai mengikuti:
sumber
Saya telah menemukan dua solusi untuk kesalahan ini
PILIHAN 1:
Buka tabel user dan password_reset Anda di folder database / migrasi
Dan cukup ubah panjang email:
PILIHAN 2:
Buka
app/Providers/AppServiceProvider.php
file Anda dan di dalamboot()
metode setel panjang string default:sumber
1- Buka
/config/database.php
dan temukan garis-garis inidan mengubahnya menjadi:
2- Jalankan
php artisan config:cache
untuk mengkonfigurasi ulang laravel3 - Hapus tabel yang ada di database Anda dan kemudian jalankan
php artisan migrate
lagisumber
Dalam file AppServiceProvider.php :
sumber
Alih-alih menetapkan batas panjang saya akan mengusulkan yang berikut, yang telah bekerja untuk saya.
Dalam:
ganti baris ini untuk mysql:
dengan:
sumber
Seperti yang dijelaskan dalam panduan Migrasi untuk memperbaikinya, yang harus Anda lakukan adalah mengedit
app/Providers/AppServiceProvider.php
file Anda dan di dalam metode boot, tentukan panjang string default:Catatan: pertama Anda harus menghapus (jika ada) tabel pengguna , tabel password_resets dari database dan menghapus entri pengguna dan password_resets dari tabel migrasi .
Untuk menjalankan semua migrasi luar biasa Anda, jalankan
migrate
perintah Artisan:Setelah itu semuanya harus berfungsi seperti biasa.
sumber
Seperti yang sudah ditentukan, kami menambahkan ke AppServiceProvider.php di App / Penyedia
Anda dapat melihat detail lebih lanjut di tautan di bawah (cari "Panjang Indeks & MySQL / MariaDB") https://laravel.com/docs/5.5/migrations
TETAPI BUKAN BUKANLAH itu yang saya terbitkan! masalahnya bahkan ketika melakukan hal di atas Anda kemungkinan akan mendapatkan kesalahan lain (saat itulah Anda menjalankan
php artisan migrate
perintah dan karena masalah panjangnya, operasi kemungkinan akan macet di tengah. solusinya di bawah , dan tabel pengguna kemungkinan dibuat tanpa istirahat atau tidak sepenuhnya benar) kita perlu memutar kembali . gulungan standar 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 kamu baik-baik saja
php artisan migrate:rollback
php artisan migrate
sumber
Solusinya tidak ada yang memberi tahu adalah bahwa dalam Mysql v5.5 dan kemudian InnoDB adalah mesin penyimpanan default yang tidak memiliki masalah ini, tetapi dalam banyak kasus seperti milik saya ada beberapa file konfigurasi mysql ini lama yang menggunakan mesin penyimpanan MYISAM lama seperti di bawah ini.
yang menciptakan semua masalah ini dan solusinya adalah perubahan default-storage-mesin untuk InnoDB di MySQL ini Penyanyi file konfigurasi sekali dan untuk semua bukannya melakukan hacks sementara.
Dan jika Anda menggunakan MySql v5.5 atau lebih baru maka InnoDB adalah mesin default sehingga Anda tidak perlu mengaturnya secara eksplisit seperti di atas, hapus saja
default-storage-engine=MYISAM
jika ada dariini
file Anda dan Anda siap untuk menggunakannya.sumber
show global variables like 'innodb_large_prefix';
harus ON . Jika MATI maka Anda dapat memeriksa jawaban ini tentang cara mengaktifkannya. Dan di sini adalah informasi lebih lanjut tentang innodb_large_prefix di dev.mysql.com.Jika Anda ingin mengubah di AppServiceProvider maka Anda perlu menentukan panjang bidang email dalam migrasi. ganti saja baris kode pertama ke baris kedua.
create_users_table
create_password_resets_table
Setelah perubahan berhasil, Anda dapat menjalankan migrasi.
Catatan: pertama Anda harus menghapus (jika ada) tabel pengguna , tabel password_resets dari database dan menghapus entri pengguna dan password_resets dari tabel migrasi.
sumber
Schema::defaultStringLength(191);
akan menentukan panjang semua string 191 secara default yang dapat merusak database Anda. Anda tidak harus pergi dengan cara ini.Cukup tentukan panjang kolom spesifik apa pun di kelas migrasi basis data. Sebagai contoh, saya mendefinisikan "nama", "nama pengguna" dan "email" di
CreateUsersTable
kelas seperti di bawah ini:sumber
Ini umum karena Laravel 5.4 mengubah charater database default yang ditetapkan ke utf8mb4. Yang harus Anda lakukan adalah: edit Aplikasi \ Providers.php Anda dengan meletakkan kode ini sebelum deklarasi kelas
Juga, tambahkan ini ke fungsi 'boot'
Schema::defaultStringLength(191);
sumber
Jika Anda belum memiliki data yang ditugaskan pada basis data Anda, lakukan hal berikut:
dan di dalam metode boot ();
Sekarang hapus catatan dalam database Anda, tabel pengguna untuk mantan.
jalankan yang berikut ini
sumber
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
sudah ada di sana. Semoga Anda memperbaikinyaSeperti 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:
Semoga ini bisa membantu Anda..mereka ..
sumber
Saya baru saja memodifikasi baris berikut dalam
users
danpassword_resets
file migrasi.Lama:
$table->string('email')->unique();
Baru:
$table->string('email', 128)->unique();
sumber
Untuk menghindari mengubah apa pun dalam kode Anda , cukup perbarui server MySQL Anda ke setidaknya 5.7.7
Referensi ini untuk info lebih lanjut: https://laravel-news.com/laravel-5-4-key-too-long-error
sumber
Saya pikir untuk memaksa StringLenght ke 191 adalah ide yang sangat buruk. Jadi saya menyelidiki untuk memahami apa yang sedang terjadi.
Saya perhatikan bahwa pesan ini salah:
Mulai muncul setelah saya memperbarui versi MySQL saya. Jadi saya sudah memeriksa tabel dengan PHPMyAdmin dan saya perhatikan bahwa semua tabel baru dibuat dengan collation utf8mb4_unicode_ci, bukan utf8_unicode_ci untuk yang lama.
Dalam file konfigurasi doktrin saya, saya perhatikan bahwa charset diatur ke utf8mb4, tetapi semua tabel saya sebelumnya dibuat di utf8, jadi saya kira ini adalah beberapa pembaruan ajaib yang mulai berfungsi pada utf8mb4.
Sekarang perbaikan yang mudah adalah dengan mengubah baris charset di file konfigurasi ORM Anda. Kemudian untuk menjatuhkan tabel menggunakan utf8mb4_unicode_ci jika Anda dalam mode dev atau memperbaiki charset jika Anda tidak bisa menjatuhkannya.
Untuk Symfony 4
Sekarang migrasi doktrin saya bekerja kembali dengan baik.
sumber
Solusi yang disarankan adalah mengaktifkan
innodb_large_prefix
opsi MySQL sehingga Anda tidak akan mendapatkan masalah berikutnya. Dan inilah cara melakukannya:Buka
my.ini
file konfigurasi MySQL dan tambahkan baris di bawah di bawah[mysqld]
baris seperti ini.Setelah itu, simpan perubahan Anda dan mulai kembali layanan MySQL Anda.
Kembalikan jika Anda perlu dan jalankan kembali migrasi Anda.
Untuk berjaga-jaga jika masalah Anda masih berlanjut, buka file konfigurasi database Anda dan atur
'engine' => null,
untuk'engine' => 'innodb row_format=dynamic'
Semoga ini bisa membantu!
sumber
pertama-tama hapus semua tabel database di localhost
Ubah properti Laravel default database (utf8mb4) di file config / database.php menjadi:
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
setelah itu Mengubah properti database lokal saya utf8_unicode_ci. tukang php bermigrasi itu ok.
sumber
Bagi siapa pun yang mungkin mengalami ini, masalah saya adalah bahwa saya membuat kolom tipe
string
dan mencoba membuatnya->unsigned()
ketika saya bermaksud untuk menjadi bilangan bulat.sumber
Yang didekati yang bekerja di sini adalah lulus param kedua dengan nama kunci (yang pendek):
sumber
Saya mendapatkan kesalahan ini meskipun saya sudah punya (sebenarnya karena saya sudah punya) Skema :: defaultStringLength (191); dalam file AppServiceProvider.php saya.
Alasannya adalah karena saya mencoba menetapkan nilai string di salah satu migrasi saya ke nilai yang lebih tinggi dari 191:
Menghapus 1000 atau mengaturnya ke 191 memecahkan masalah saya.
sumber