Błąd migracji w Laravel 5.4 z php artisan make:auth
[Illuminate \ Database \ QueryException] SQLSTATE [42000]: Błąd składni lub naruszenie zasad dostępu: 1071 Podany klucz był za długi; maksymalna długość klucza to 767 bajtów (SQL: alter tabl e
users
add uniqueusers_email_unique
([Wyjątek PDO] SQLSTATE [42000]: Błąd składni lub naruszenie zasad dostępu: 1071 Podany klucz był za długi; maksymalna długość klucza to 767 bajtów
Odpowiedzi:
Zgodnie z oficjalną dokumentacją można to dość łatwo rozwiązać.
Dodaj następujące dwie linie kodu do AppServiceProvider.php (/app/Providers/AppServiceProvider.php)
źródło
Nie wiem, dlaczego powyższe rozwiązanie i oficjalne rozwiązanie, które dodaje
w
AppServiceProvider
nie działa dla mnie. To, co zadziałało, to edycjadatabase.php
pliku wconfig
folderze. Po prostu edytujdo
i powinno działać, chociaż nie będzie można przechowywać rozszerzonych znaków wielobajtowych, takich jak emoji .
Zrobiłem to z Laravelem 5.7. Mam nadzieję, że to pomoże.
źródło
use Illuminate\Support\Facades\Schema;
na górze.utf8mb4
istnieje nie bez powodu, polecam go używać, jeśli możesz.Po prostu dodaję tę odpowiedź, ponieważ jest to
quickest
dla mnie rozwiązanie. Wystarczy ustawić domyślny silnik bazy danych do'InnoDB'
dnia/config/database.php
następnie uruchom,
php artisan config:cache
aby wyczyścić i odświeżyć pamięć podręczną konfiguracjiźródło
W
AppServiceProvider.php
, dołączasz ten kod na początku pliku.źródło
Ten problem jest spowodowany w Laravel 5.4 przez wersję bazy danych.
Według dokumentów (w
Index Lengths & MySQL / MariaDB
dziale):Innymi słowy, w
<ROOT>/app/Providers/AppServiceProvider.php
:Ale jak mówi komentarz do drugiej odpowiedzi:
Tak więc dokumentacja proponuje również inne rozwiązanie:
źródło
Dla kogoś, kto nie chce się zmieniać
AppServiceProvider.php
. (Moim zdaniem zmiana jest złym pomysłemAppServiceProvider.php
tylko na potrzeby migracji )Możesz dodać z powrotem długość danych do pliku migracji,
database/migrations/
jak poniżej:create_users_table.php
create_password_resets_table.php
źródło
Jeśli napotkasz ten błąd podczas pracy na laravel podczas używania polecenia:
php artisan migrate
po prostu dodaj 2 linie w pliku: app-> Providers-> AppServiceProvider.phpuse Schema;
Schema::defaultStringLength(191);
proszę sprawdzić ten obraz . następnie
php artisan migrate
ponownie uruchom polecenie.źródło
\Schema::defaultStringLength(191);
Dodaję dwa rozwiązania, które działają dla mnie.
Pierwszym rozwiązaniem jest :
Edytuj
'engine' => null,
do'engine' => 'InnoDB',
To zadziałało dla mnie.
Drugim rozwiązaniem jest:
Otwórz plik database.php katalog konfiguracyjny insde / folder.
2. Edytuj
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
w
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Powodzenia
źródło
zaktualizuj i wstaw te linie w app / Providers / AppServiceProvider.php
źródło
Rozwiązałem ten problem i zmodyfikowałem mój plik config-> database.php tak, aby polubił moją bazę danych ('charset' => 'utf8') i ('collation' => 'utf8_general_ci') , więc mój problem został rozwiązany jako podążać:
źródło
Znalazłem dwa rozwiązania tego błędu
OPCJA 1:
Otwórz tabelę user i password_reset w folderze bazy danych / migracje
I po prostu zmień długość e-maila:
OPCJA 2:
Otwórz
app/Providers/AppServiceProvider.php
plik i wewnątrzboot()
metody ustaw domyślną długość ciągu:źródło
1- Idź do
/config/database.php
i znajdź te liniei zmień je na:
2- Biegnij,
php artisan config:cache
aby zmienić konfigurację laravela3- Usuń istniejące tabele w bazie danych, a następnie uruchom
php artisan migrate
ponownieźródło
W pliku AppServiceProvider.php :
źródło
Zamiast ustalać limit długości, zaproponowałbym następujące rozwiązanie, które zadziałało w moim przypadku.
Wewnątrz:
zamień tę linię na mysql:
z:
źródło
Jak opisano w przewodniku po migracji, aby to naprawić, wszystko, co musisz zrobić, to wyedytować
app/Providers/AppServiceProvider.php
plik i ustawić domyślną długość ciągu w metodzie rozruchu:Uwaga: najpierw musisz usunąć (jeśli masz) tabelę użytkowników, tabelę password_resets z bazy danych oraz usunąć wpisy users i password_resets z migracji tabeli .
Aby uruchomić wszystkie zaległe migracje, wykonaj
migrate
polecenie Artisan:Potem wszystko powinno działać normalnie.
źródło
Jak już wspomniano, dodajemy do AppServiceProvider.php w App / Providers
możesz zobaczyć więcej szczegółów w linku poniżej (wyszukaj "Index Lengths & MySQL / MariaDB") https://laravel.com/docs/5.5/migrations
ALE Cóż, nie o tym wszystko opublikowałem! Chodzi o to, że nawet robiąc powyższe prawdopodobnie wystąpi kolejny błąd (to jest po uruchomieniu
php artisan migrate
polecenia i ze względu na problem z długością, operacja prawdopodobnie utknie w środku. rozwiązanie jest poniżej , a tabela użytkownika prawdopodobnie zostanie utworzona bez reszty lub nie do końca poprawnie) musimy wycofać się . domyślne przywracanie nie będzie działać. ponieważ operacja migracji nie lubiła zakończenia. musisz ręcznie usunąć nowo utworzone tabele w bazie danych.możemy to zrobić za pomocą majsterkowania jak poniżej:
Sam miałem problem z tabelą użytkowników.
po tym jesteś gotowy
php artisan migrate:rollback
php artisan migrate
źródło
Rozwiązaniem, którego nikt nie mówi, jest to, że w Mysql v5.5 i późniejszych InnoDB jest domyślnym silnikiem pamięci masowej, który nie ma tego problemu, ale w wielu przypadkach, takich jak mój, istnieją stare pliki konfiguracyjne mysql ini, które używają starego silnika pamięci MYISAM , jak poniżej.
co stwarza wszystkie te problemy, a rozwiązaniem jest zmiana default-storage-engine na InnoDB w pliku konfiguracyjnym ini MySQL raz na zawsze, zamiast robić tymczasowe hacki.
A jeśli korzystasz z MySql w wersji 5.5 lub nowszej, to InnoDB jest domyślnym silnikiem, więc nie musisz go ustawiać tak jak powyżej, po prostu usuń
default-storage-engine=MYISAM
jeśli istnieje zini
pliku i możesz zaczynać.źródło
show global variables like 'innodb_large_prefix';
że powinna być włączona . Jeśli jest WYŁĄCZONA , możesz sprawdzić tę odpowiedź, jak ją włączyć. A oto więcej informacji o innodb_large_prefix na dev.mysql.com.Jeśli chcesz zmienić w AppServiceProvider, musisz zdefiniować długość pola e-mail w migracji. po prostu zamień pierwszą linię kodu na drugą.
create_users_table
create_password_resets_table
Po pomyślnych zmianach możesz uruchomić migrację.
Uwaga: najpierw trzeba usunąć (jeśli masz) tabeli użytkowników , password_resets tabelę z bazy danych i usuwania użytkowników i password_resets wpisów z tabeli migracji.
źródło
Schema::defaultStringLength(191);
domyślnie zdefiniuje długość wszystkich 191 łańcuchów, co może zrujnować bazę danych. Nie możesz iść tą drogą.Wystarczy zdefiniować długość dowolnej kolumny w klasie migracji bazy danych. Na przykład definiuję „imię”, „nazwę użytkownika” i „adres e-mail” w
CreateUsersTable
klasie, jak poniżej:źródło
Jest to powszechne, ponieważ Laravel 5.4 zmienił domyślny znak bazy danych ustawiony na utf8mb4. Co musisz zrobić, to: wyedytuj plik App \ Providers.php, umieszczając ten kod przed deklaracją klasy
Dodaj to również do funkcji „boot”
Schema::defaultStringLength(191);
źródło
Jeśli nie masz już przypisanych żadnych danych do swojej bazy danych, wykonaj następujące czynności:
i wewnątrz metody boot ();
Teraz usuń rekordy w swojej bazie danych, tabeli użytkowników np.
uruchom następujące
źródło
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
że już tam jest. Mam nadzieję, że toJak opisano w przewodniku po migracji, aby to naprawić, wszystko, co musisz zrobić, to wyedytować plik AppServiceProvider.php i ustawić domyślną długość ciągu w metodzie rozruchu:
Mam nadzieję, że to ci pomoże ...
źródło
Właśnie zmodyfikowałem następujący wiersz w
users
ipassword_resets
plik migracji.Stary:
$table->string('email')->unique();
Nowy :
$table->string('email', 128)->unique();
źródło
Aby uniknąć zmiany czegokolwiek w kodzie , po prostu zaktualizuj serwer MySQL do co najmniej 5.7.7
Zobacz to, aby uzyskać więcej informacji: https://laravel-news.com/laravel-5-4-key-too-long-error
źródło
Myślę, że wymuszenie StringLenght na 191 to naprawdę zły pomysł. Więc badam, aby zrozumieć, co się dzieje.
Zauważyłem, że ten komunikat o błędzie:
Zaczęło się pojawiać po zaktualizowaniu mojej wersji MySQL. Więc sprawdziłem tabele za pomocą PHPMyAdmin i zauważyłem, że wszystkie nowe utworzone tabele były z sortowaniem utf8mb4_unicode_ci zamiast utf8_unicode_ci dla starych.
W moim pliku konfiguracyjnym doktryny zauważyłem, że charset został ustawiony na utf8mb4, ale wszystkie moje poprzednie tabele zostały utworzone w utf8, więc myślę, że jest to jakaś magia aktualizacji, która zaczyna działać na utf8mb4.
Teraz prostą poprawką jest zmiana zestawu znaków linii w pliku konfiguracyjnym ORM. Następnie usuń tabele za pomocą utf8mb4_unicode_ci, jeśli jesteś w trybie programisty lub napraw kodowanie, jeśli nie możesz ich upuścić.
Dla Symfony 4
Teraz migracje moich doktryn znów działają dobrze.
źródło
Zalecanym rozwiązaniem jest włączenie
innodb_large_prefix
opcji MySQL, dzięki czemu nie będziesz mieć kolejnych problemów. A oto jak to zrobić:Otwórz
my.ini
plik konfiguracyjny MySQL i dodaj poniższe wiersze pod[mysqld]
wierszem w ten sposób.Następnie zapisz zmiany i uruchom ponownie usługę MySQL.
Cofnij zmiany, jeśli to konieczne, a następnie ponownie uruchom migrację.
Na wypadek, gdyby problem nadal występował, przejdź do pliku konfiguracyjnego bazy danych i ustaw
'engine' => null,
do'engine' => 'innodb row_format=dynamic'
Mam nadzieję, że to pomoże!
źródło
najpierw usuń wszystkie tabele bazy danych na hoście lokalnym
Zmień właściwości domyślnej bazy danych Laravel (utf8mb4) w pliku config / database.php na:
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
później Zmiana właściwości mojej lokalnej bazy danych utf8_unicode_ci. php artisan migrate, to jest w porządku.
źródło
Dla każdego, kto mógłby się z tym spotkać, moim problemem było to, że tworzyłem kolumnę typu
string
i próbowałem to zrobić,->unsigned()
gdy chciałem, aby była to liczba całkowita.źródło
Podejście do tej pracy polegało na przekazaniu drugiego parametru z nazwą klucza (krótkiej):
źródło
Otrzymałem ten błąd, mimo że już miałem (właściwie dlatego, że już miałem) Schema :: defaultStringLength (191); w moim pliku AppServiceProvider.php.
Powodem jest to, że próbowałem ustawić wartość ciągu w jednej z moich migracji na wartość wyższą niż 191:
Usunięcie 1000 lub ustawienie go na 191 rozwiązało mój problem.
źródło