Próbuję przenieść tabelę użytkowników w Laravel. Kiedy uruchamiam migrację, pojawia się ten błąd:
[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 table
users
add unique users_email_uniq (
moja migracja wygląda następująco:
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');
});
Po pewnym googlowaniu natknąłem się na ten raport o błędzie, w którym Taylor mówi, że możesz określić klucz indeksu jako drugi parametr unique()
, co zrobiłem. Nadal daje błąd. Co tu się dzieje?
Odpowiedzi:
Określ mniejszą długość wiadomości e-mail:
Która jest właściwie domyślna:
I powinieneś być dobry.
Dla Laravel 5.4 możesz znaleźć rozwiązanie w tym Laravel 5.4: Określony klucz był zbyt długi błąd, post z Laravel News :
Jak 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:
źródło
254
więc prawdopodobnie warta zapamiętania, więc w takim przypadku prawdopodobnie zweryfikowałbym wyjątkowość za pomocą walidatora.\Illuminate\Database\Schema\Builder::defaultStringLength(191);
poprawnej ścieżki odniesienia do funkcjiZaktualizuj 1
Od wersji Laravel 5.4 te zmiany nie są już potrzebne.
Zaktualizuj 2
Bieżące produkcyjne wersje MariaDB NIE obsługują tego ustawienia domyślnie na całym świecie. Jest on domyślnie zaimplementowany w MariaDB 10.2.2+ .
Rozwiązanie
A jeśli celowo chcesz używać poprawnego domyślnego ustawienia future (począwszy od Laravel 5.4) wielobajtowego
utf8mb4
wsparcia UTF8 dla 😀, zacznij naprawiać 😂 konfigurację bazy danych.W Laravel
config/database.php
zdefiniuj:DYNAMIC
pozwala na przechowywanie długich indeksów kluczy .Ustawienia serwera (domyślnie zawarte w MySQL 5.7.7+ / MariaDB 10.2.2+):
Dla klientów:
A następnie ZATRZYMAJ swój serwer MySQL / MariaDB. Po tym STARTU. Hot RESTART może nie działać.
Teraz masz Laravel 5.x z obsługą UTF8.
źródło
database.php
pliku konfiguracyjnym i wpłynie to na lokalny projekt Laravel. Upewnij się, żedelete
baza danych jest przed wprowadzeniem zmian i utwórz ją z nowymi ustawieniami. Musisz zmienićmy.cnf
plik konfiguracyjny tylko w przypadku globalnych zmian po stronie serwera (obecnie używane są wszystkie nowe instalacjeutf8mb4
).options={"row_format"="DYNAMIC"}
do swojej@Table
adnotacji.Jeśli jesteś włączony lub zaktualizowany do Laravel 5.4 To zadziałało dla mnie;
Tylko 1 zmiana. w AppServiceProvider.php
Jak wspomniano w przewodniku migracji https://laravel.com/docs/master/migrations#creating-indexes
źródło
Jeśli ktoś inny natknie się na tę odpowiedź, tak jak ja, ale z innego powodu, możesz sprawdzić swój zestaw znaków / zestawień Laravel DB.
Instalowałem aplikację (Snipe-IT) i skonfigurowałem konfigurację bazy danych Laravel tak, aby korzystała z następujących elementów:
Usunięcie
mb4
obu łańcuchów rozwiązało problem, chociaż uważam, że odpowiedź Antonio jest prawdziwym rozwiązaniem problemu.źródło
To zadziałało dla mnie:
źródło
Usuń mb4 z charset i collation z config / database.php, a następnie uruchomi się pomyślnie.
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
źródło
Dla laravel 5.6
To rozwiązanie rozwiązuje mój problem,
przejdź do
config/database.php
Znajdowanie kodu poniżej
Zmień to dwa pola
Z tym
źródło
Napotkałem ten sam problem i naprawiłem go, dodając poniższe dwie linie do mojego pliku app / database.php
Mój plik wygląda jak poniżej:
źródło
W przypadku laravel 5.4 po prostu edytuj plik
źródło
źródło
Miałem ten sam problem i używam wampa
Rozwiązanie: Otwórz plik: config / database.php
Dzięki
źródło
W pliku config / database.php, gdzie:
Zmień ten wiersz na ten:
źródło
Dla laravel> = 5,6 użytkownicy
Otwórz
AppServiceProvider.php
plikUżyj następującej klasy
Następnie wewnątrz
boot
metody dodaj następujący wierszźródło
Dodałem do samej migracji
tak, wiem, że muszę wziąć to pod uwagę przy każdej migracji, ale wolałbym to niż schowanie go w jakimś zupełnie niepowiązanym dostawcy usług
źródło
Jeśli ktoś ma ten problem nawet po zrobieniu, powyższe zmiany. Na przykład w moim przypadku dokonałem poniższych zmian,
Ale to nie zadziała od razu z dwóch powodów. Po pierwsze, jeśli używasz lumen zamiast laravel, być może będziesz musiał najpierw odkomentować tę linię w pliku app.php.
Następnie musisz ponownie utworzyć skrypt migracji za pomocą polecenia artisan,
Od teraz będą działać tylko zmiany wprowadzone w ServiceProvider.
źródło
dla laravel 5.7 napisz ten kod w pliku appserviceprovider.php
źródło
Zmień zestaw znaków z „utf8mb4” na „utf8” i
sortowanie do „utf8mb4_unicode_ci” do „utf8_unicode_ci”
w pliku config / database.php
U mnie to zadziałało.
źródło
Laravel domyślnie używa
utf8mb4
zestawu znaków, który obejmuje obsługę przechowywania "emotikonów" w bazie danych. Jeśli używasz wersji MySQL starszej niż wersja 5.7.7 lub MariaDB starszej niż wersja 10.2.2, może być konieczne ręczne skonfigurowanie domyślnej długości łańcucha generowanego przez migracje, aby MySQL mógł utworzyć dla nich indeksy. Możesz to skonfigurować, wywołującSchema::defaultStringLength
metodę w swoimAppServiceProvider
:Możesz się wymeldować
https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes
źródło
Dzieje się tak, ponieważ Laravel 5.4 używa utf8mb4, który obsługuje przechowywanie emoji.
Dodaj to do swojej aplikacji \ Providers \ AppServiceProvider.php
i powinieneś być gotowy.
źródło
Jeśli jesteś włączony lub zaktualizowany do Laravel 5.4 i najnowszej wersji, to działa;
Tylko 1 zmiana w AppServiceProvider.php
źródło
Chciałbym zwrócić uwagę na coś, co przegapiłem ...
Jestem nowy w Laravel i nie skopiowałem "use Illuminate .....", ponieważ naprawdę nie zwróciłem uwagi, ponieważ tuż nad funkcją boot masz już instrukcję use .
Mam nadzieję, że to pomoże każdemu
źródło
\
Miałem problem, zmień konfigurację 'config / database'
zachowanie tego samego wzorca w bazie danych.
Następnie wydałem polecenie
źródło
24 października 2016 Taylor Otwell ogłosił na Twitterze autorem Laravel
którym przed wersją 5.4 był zestaw znaków
utf8
W tym stuleciu wiele aplikacji internetowych zawiera czat lub jakąś platformę umożliwiającą użytkownikom rozmowę, a wiele osób lubi używać emotikonów lub emotikonów. i to są jakieś super bohaterów, które wymagają więcej miejsca do przechowywania i że będzie to możliwe tylko przy użyciu
utf8mb4
jako charset . To jest powód, dla którego migrująutf8mb4
tylko w celach kosmicznych.jeśli spojrzysz w górę w
Illuminate\Database\Schema\Builder
klasie, zobaczysz, że$defaultStringLength
jest ustawiona na 255 , i aby zmodyfikować, możesz przejść przezSchema
Facade i wywołaćdefaultStringLength
metodę i przekazać nową długość.aby wykonać tę zmianę, wywołaj tę metodę w swojej
AppServiceProvider
klasie, która znajduje się w podkatalogu app \ provider, tak jak toZasugeruję użycie 191 jako wartości tylko dlatego, że MySQL obsługuje 767 bajtów i dlatego, że
767 / 4
jest to liczba bajtów zajmowana przez każdy otrzymany znak wielobajtowy191
.Możesz dowiedzieć się więcej tutaj Zestaw znaków utf8mb4 (4-bajtowe kodowanie Unicode UTF-8) Limity liczby kolumn tabeli i rozmiaru wiersza
źródło
191
magiczną liczbę.ROZWIĄZANIE:
Najpierw zmień defaultStringLength na 191 w app \ Providers \ AppServiceProvider.php :
Następnie zmień wartości zestawu znaków i sortowania w następujący sposób, w config \ database.php :
( link do informacji o zestawie znaków MariaDB )
źródło
Przechodzenie do twojego
config/database.php
i zmiana zestawu znaków i sortowania z utf8mb4 na utf8Mój problem został rozwiązany tą metodą, powodzenia stary!
źródło
Nie będziesz mieć tego problemu, jeśli używasz MySQL 5.7.7+ lub MariaDB 10.2.2+.
Aby zaktualizować MariaDB na komputerze Mac za pomocą Brew, najpierw odłącz bieżącą:
brew unlink mariadb
a następnie zainstaluj wersję deweloperską za pomocąbrew install mariadb --devel
Po zakończeniu instalacji zatrzymaj / uruchom uruchomioną usługę:
brew services stop mariadb brew services start mariadb
Bieżąca wersja deweloperska to 10.2.3. Po zakończeniu instalacji nie będziesz już musiał się tym martwić i możesz używać utf8mb4 (który jest teraz domyślny w Laravel 5.4) bez przełączania się z powrotem na utf8 ani edytowania AppServiceProvider, jak zaproponowano w dokumentacji Laravel: https: // laravel .com / docs / master / release # laravel-5.4 (przewiń w dół do: Migration Default String Length )
źródło
Właśnie zainstalowałem MariaDB 10.2.4 RC, uruchomiłem nowy pusty projekt Laravel 5.4 i działa domyślna migracja (kolumny varchar (255)).
Nie ma potrzeby zmiany DB conf i Laravael
config/database.php
. Tak więc, jak zauważył @scorer o domyślnym zachowaniu w wersji 10.2.2+.źródło
Wszystko zostało dobrze opisane w innych Anwser, więcej szczegółów znajdziesz w linku poniżej (szukaj za pomocą klucza „Długość indeksu i MySQL / MariaDB”) https://laravel.com/docs/5.5/migrations
ALE Cóż, nie o to chodzi w tej odpowiedzi! Chodzi o to, że nawet wykonując powyższe , polubisz kolejny błąd (wtedy lubisz
php artisan migrate
polecenie uruchomienia i ze względu na problem z długością, operacja utknęła w środku. rozwiązanie jest poniżej , a tabela użytkownika jest jak utworzona bez reszta lub nie do końca poprawnie) musimy rzucić bac k. domyślne wycofanie nie zrobi. 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 możesz już iść
źródło
Ustaw silnik bazy danych InnoDB:
źródło
Jeśli wypróbowałeś wszystkie inne odpowiedzi i nie zadziałały, możesz usunąć wszystkie tabele z bazy danych, a następnie wykonać polecenie migracji wszystkie naraz, używając tego polecenia:
źródło