Erro de migração no Laravel 5.4 com php artisan make:auth
[Illuminate \ Database \ QueryException] SQLSTATE [42000]: Erro de sintaxe ou violação de acesso: 1071 A chave especificada era muito longa; o comprimento máximo da chave é 767 bytes (SQL: alterar tabela e
users
adicionar exclusivousers_email_unique
([PDOException] SQLSTATE [42000]: Erro de sintaxe ou violação de acesso: 1071 A chave especificada era muito longa; o comprimento máximo da chave é 767 bytes
Respostas:
De acordo com a documentação oficial , você pode resolver isso facilmente.
Adicione as duas linhas de código a seguir no AppServiceProvider.php (/app/Providers/AppServiceProvider.php)
fonte
Não sei por que a solução acima e a solução oficial que está adicionando
em
AppServiceProvider
não funcionou para mim. O que funcionou foi a edição dodatabase.php
arquivo naconfig
pasta. Apenas editepara
e deve funcionar, embora você não consiga armazenar caracteres multibyte estendidos, como emoji .
Eu fiz isso com o Laravel 5.7. Espero que ajude.
fonte
use Illuminate\Support\Facades\Schema;
no topo.utf8mb4
agrupamento existe por um motivo, eu recomendo usá-lo, se puder.Estou apenas adicionando esta resposta aqui, pois é a
quickest
solução para mim. Basta definir o motor de banco de dados padrão para'InnoDB'
a/config/database.php
em seguida, execute
php artisan config:cache
para limpar e atualizar o cache de configuraçãofonte
No
AppServiceProvider.php
, você inclui esse código na parte superior do arquivo.fonte
Esse problema é causado no Laravel 5.4 pela versão do banco de dados.
De acordo com os documentos (na
Index Lengths & MySQL / MariaDB
seção):Em outras palavras, em
<ROOT>/app/Providers/AppServiceProvider.php
:Mas como o comentário da outra resposta diz:
Portanto, a documentação também propõe outra solução:
fonte
Para alguém que não quer mudar
AppServiceProvider.php
. (Na minha opinião, é uma má ideia mudarAppServiceProvider.php
apenas para migração)Você pode adicionar novamente o comprimento dos dados ao arquivo de migração,
database/migrations/
conforme abaixo:create_users_table.php
create_password_resets_table.php
fonte
Se você enfrentar esse erro enquanto trabalha no laravel enquanto usa o comando:
php artisan migrate
basta adicionar 2 linhas no arquivo: app-> Providers-> AppServiceProvider.phpuse Schema;
Schema::defaultStringLength(191);
por favor verifique esta imagem . depois execute o
php artisan migrate
comando novamente.fonte
\Schema::defaultStringLength(191);
Estou adicionando duas soluções que funcionam para mim.
A primeira solução é :
Editar
'engine' => null,
para'engine' => 'InnoDB',
Isso funcionou para mim.
A segunda solução é:
Abra o arquivo database.php na pasta / diretório de configuração .
2. Edite
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
para
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
Boa sorte
fonte
atualize e insira essas linhas em app / Providers / AppServiceProvider.php
fonte
Resolvi esse problema e editei meu arquivo config-> database.php para gostar do meu banco de dados ('charset' => 'utf8') e do ('collation' => 'utf8_general_ci') , portanto, meu problema foi resolvido com o código como Segue:
fonte
Encontrei duas soluções para este erro
OPÇÃO 1:
Abra sua tabela user e password_reset na pasta banco de dados / migrações
E basta alterar o tamanho do email:
OPÇÃO 2:
Abra seu
app/Providers/AppServiceProvider.php
arquivo e, dentro doboot()
método, defina um tamanho de string padrão:fonte
1- Vá
/config/database.php
e encontre estas linhase altere-os para:
2- Execute
php artisan config:cache
para reconfigurar o laravel3- Exclua as tabelas existentes no seu banco de dados e execute
php artisan migrate
novamentefonte
No arquivo AppServiceProvider.php :
fonte
Em vez de estabelecer um limite de comprimento, proporia o seguinte, que funcionou para mim.
Dentro:
substitua esta linha pelo mysql:
com:
fonte
Conforme descrito no guia Migrações para corrigir isso, tudo o que você precisa fazer é editar seu
app/Providers/AppServiceProvider.php
arquivo e, dentro do método de inicialização, definir um tamanho de string padrão:Nota: primeiro você deve excluir (se tiver) a tabela de usuários , a tabela password_resets do banco de dados e excluir as entradas de usuários e password_resets das migrações tabela de .
Para executar todas as suas migrações pendentes, execute o
migrate
comando Artisan:Depois disso, tudo deve funcionar normalmente.
fonte
Conforme já especificado, adicionamos ao AppServiceProvider.php em App / Providers
você pode ver mais detalhes no link abaixo (pesquise "Comprimentos de índice e MySQL / MariaDB") https://laravel.com/docs/5.5/migrations
Mas bem, não é isso que publiquei! o problema é que, mesmo ao fazer o procedimento acima, você provavelmente obterá outro erro (é quando você executa o
php artisan migrate
comando e, devido ao problema do comprimento, a operação provavelmente ficará no meio. a solução está abaixo e a tabela do usuário provavelmente é criada sem o resto ou não totalmente correto) , precisamos reverter . a reversão padrão não funcionará. porque a operação de migração não gostou de terminar. você precisa excluir as novas tabelas criadas no banco de dados manualmente.podemos fazer isso usando o funileiro, como abaixo:
Eu mesmo tive um problema com a tabela de usuários.
depois disso você está pronto para ir
php artisan migrate:rollback
php artisan migrate
fonte
A solução que ninguém diz é que no Mysql v5.5 e posterior o InnoDB é o mecanismo de armazenamento padrão que não apresenta esse problema, mas em muitos casos como o meu, existem alguns arquivos de configuração antigos do mysql ini que usam o antigo mecanismo de armazenamento MYISAM como abaixo.
que está criando todos esses problemas e a solução é alterar o mecanismo de armazenamento padrão para o InnoDB no arquivo de configuração ini do Mysql de uma vez por todas, em vez de fazer hacks temporários.
E se você estiver no MySql v5.5 ou posterior, o InnoDB é o mecanismo padrão, portanto você não precisa defini-lo explicitamente como acima, apenas remova o
default-storage-engine=MYISAM
se ele existir no seuini
arquivo e você estará pronto .fonte
show global variables like 'innodb_large_prefix';
ela deve estar LIGADA . Se estiver desativado , você pode verificar esta resposta sobre como ativá-lo. E aqui estão mais informações sobre innodb_large_prefix em dev.mysql.com.Se você deseja alterar no AppServiceProvider, precisa definir o comprimento do campo de email na migração. basta substituir a primeira linha de código pela segunda linha.
create_users_table
create_password_resets_table
Após as alterações bem-sucedidas, você pode executar a migração.
Nota: primeiro você deve excluir (se tiver) a tabela de usuários , a tabela password_resets do banco de dados e excluir as entradas de usuários e password_resets da tabela de migração.
fonte
Schema::defaultStringLength(191);
definirá o tamanho de todas as strings 191 por padrão, o que pode arruinar seu banco de dados. Você não deve ir por esse caminho.Basta definir o comprimento de qualquer coluna específica na classe de migração do banco de dados. Por exemplo, estou definindo "nome", "nome de usuário" e "email" na
CreateUsersTable
classe, como abaixo:fonte
Isso é comum, pois o Laravel 5.4 alterou o caractere padrão do banco de dados definido para utf8mb4. O que você precisa fazer é: editar seu App \ Providers.php colocando esse código antes da declaração da classe
Além disso, adicione isso à função 'boot'
Schema::defaultStringLength(191);
fonte
Se você ainda não possui nenhum dado atribuído ao seu banco de dados, faça o seguinte:
e dentro do método boot ();
Agora exclua os registros em seu banco de dados, tabela de usuários para ex.
execute o seguinte
fonte
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
já está lá. Espero que você corrigi-loConforme descrito no guia Migrações para corrigir isso, tudo o que você precisa fazer é editar o arquivo AppServiceProvider.php e, dentro do método de inicialização, defina um tamanho de string padrão:
Espero que isso ajude você .. cheers ..
fonte
Acabei de modificar a seguinte linha
users
epassword_resets
arquivo de migração.Velho :
$table->string('email')->unique();
Novo :
$table->string('email', 128)->unique();
fonte
Para evitar alterar qualquer coisa em seu código , simplesmente atualize seu servidor MySQL para pelo menos 5.7.7
Consulte isso para obter mais informações: https://laravel-news.com/laravel-5-4-key-too-long-error
fonte
Eu acho que forçar a StringLenght a 191 é uma péssima idéia. Então, eu investigo para entender o que está acontecendo.
Percebi que esta mensagem de erro:
Comecei a aparecer depois que atualizei minha versão do MySQL. Portanto, verifiquei as tabelas com o PHPMyAdmin e notei que todas as novas tabelas criadas estavam com o agrupamento utf8mb4_unicode_ci em vez de utf8_unicode_ci para as antigas.
No meu arquivo de configuração da doutrina, notei que o charset estava definido como utf8mb4, mas todas as minhas tabelas anteriores foram criadas no utf8, então acho que essa é uma mágica de atualização que começa a funcionar no utf8mb4.
Agora, a solução mais fácil é alterar o conjunto de caracteres de linha no seu arquivo de configuração do ORM. Em seguida, descarte as tabelas usando utf8mb4_unicode_ci se você estiver no modo dev ou corrija o charset se não puder descartá-las.
Para Symfony 4
Agora, minhas migrações de doutrina estão funcionando novamente muito bem.
fonte
A solução recomendada é habilitar
innodb_large_prefix
opção do MySQL para que você não entre em problemas subseqüentes. E aqui está como fazer isso:Abra o
my.ini
arquivo de configuração do MySQL e adicione as linhas abaixo sob a[mysqld]
linha como esta.Depois disso, salve as alterações e reinicie o serviço MySQL.
Faça o retrocesso, se necessário, e execute novamente a migração.
Caso seu problema persista, vá para o arquivo de configuração do banco de dados e defina
'engine' => null,
para'engine' => 'innodb row_format=dynamic'
Espero que ajude!
fonte
primeiro exclua todas as tabelas do banco de dados no host local
Altere as propriedades do banco de dados padrão do Laravel (utf8mb4) no arquivo config / database.php para:
'charset' => 'utf8', 'agrupamento' => 'utf8_unicode_ci',
depois disso Alterando minhas propriedades do banco de dados local utf8_unicode_ci. artesão php migrar está tudo bem.
fonte
Para qualquer outra pessoa que possa se deparar com isso, meu problema é que eu estava criando uma coluna do tipo
string
e tentando fazê-la->unsigned()
quando pretendia que fosse um número inteiro.fonte
O trabalho abordado aqui foi passar um segundo parâmetro com o nome da chave (um nome curto):
fonte
Eu estava recebendo esse erro, embora já tivesse (na verdade, porque já tinha) Schema :: defaultStringLength (191); no meu arquivo AppServiceProvider.php.
O motivo é que eu estava tentando definir um valor de sequência em uma das minhas migrações para um valor maior que 191:
Remover o 1000 ou defini-lo como 191 resolveu meu problema.
fonte