Estou tentando migrar uma tabela de usuários no Laravel. Quando executo minha migração, recebo este erro:
[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: alter table,
users
adicione users_email_uniq (
minha migração é a seguinte:
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');
});
Depois de pesquisar no Google, deparei-me com este relatório de erros em que Taylor diz que você pode especificar a chave de índice como o 2º parâmetro unique()
, o que eu fiz. Ainda dá o erro. O que está acontecendo aqui?
Respostas:
Especifique um tamanho menor para o seu email:
Qual é o padrão, na verdade:
E você deve ser bom.
Para o Laravel 5.4, você pode encontrar uma solução neste Laravel 5.4: Erro especificado na chave especificada por muito tempo, Post do Laravel News :
Conforme 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:
fonte
254
Provavelmente, o tamanho máximo possível do e-mail vale a pena ter isso em mente, então provavelmente validaria a exclusividade usando o validator nesse caso.\Illuminate\Database\Schema\Builder::defaultStringLength(191);
para o percurso da referência função correctaAtualização 1
A partir do Laravel 5.4, essas mudanças não são mais necessárias.
Atualização 2
As versões atuais do MariaDB de produção NÃO suportam essa configuração por padrão globalmente. É implementado no MariaDB 10.2.2+ por padrão .
Solução
E se você intencionalmente deseja usar o
utf8mb4
suporte a vários bytes padrão UTF8 para o padrão futuro correto (a partir do Laravel 5.4) para 😀, comece a corrigir a configuração da sua base de dados.No Laravel
config/database.php
defina:DYNAMIC
permite armazenar índices de chave longos .Configurações do servidor (por padrão, incluídas no MySQL 5.7.7+ / MariaDB 10.2.2+):
Para clientes:
E então PARE seu servidor MySQL / MariaDB. Depois disso, comece. RESTART quente pode não funcionar.
Agora você tem o Laravel 5.x com suporte a UTF8.
fonte
database.php
arquivo de configuração e impactará o projeto local do Laravel. Verifique odelete
banco de dados antes de fazer alterações e crie-o com novas configurações. Você precisa alterar omy.cnf
arquivo de configuração apenas para alterações globais no servidor (atualmente todas as novas instalações são usadasutf8mb4
).options={"row_format"="DYNAMIC"}
para sua@Table
anotação.Se você está atualizado ou atualizado para o Laravel 5.4 Isso funcionou para mim;
Apenas 1 mudança. em AppServiceProvider.php
Conforme mencionado no guia de migração https://laravel.com/docs/master/migrations#creating-indexes
fonte
Se mais alguém se deparar com essa resposta, como eu fiz, mas por um motivo diferente, verifique o conjunto de caracteres / agrupamento do Laravel DB.
Eu estava instalando um aplicativo (Snipe-IT) e havia configurado a configuração do banco de dados do Laravel para usar o seguinte:
A remoção
mb4
das duas seqüências corrigiu o problema, embora eu acredite que a resposta de Antonio seja a verdadeira solução para o problema.fonte
Isso funcionou para mim:
fonte
Remova o mb4 do charset e o agrupamento de config / database.php, e ele será executado com sucesso.
'charset' => 'utf8',
'agrupamento' => 'utf8_unicode_ci',
fonte
Para laravel 5,6
Esta solução resolver o meu problema
ir para
config/database.php
Encontrar o código abaixo
Alterar esses dois campos
Com isso
fonte
Eu enfrentei o mesmo problema e o corrigi adicionando as duas linhas abaixo no meu app / database.php
Meu arquivo se parece abaixo:
fonte
Para o laravel 5.4, basta editar o arquivo
fonte
fonte
eu tive o mesmo problema e estou usando um wamp
Solução: Abrir arquivo: config / database.php
obrigado
fonte
No arquivo config / database.php, em que:
Mude esta linha para isto:
fonte
Para Laravel> = 5.6 usuários
Abrir
AppServiceProvider.php
arquivoUse a seguinte classe
Em seguida, dentro do
boot
método, adicione a seguinte linhafonte
Eu adicionei à própria migração
sim, eu sei que preciso considerá-lo em todas as migrações, mas eu prefiro que isso esteja escondido em algum provedor de serviços completamente independente
fonte
Se alguém com esse problema, mesmo depois de fazer, as alterações acima mencionadas. Por exemplo, no meu caso, fiz as alterações abaixo,
Mas não funcionaria imediatamente por dois motivos. Uma é que se você estiver usando lúmen em vez de laravel, talvez seja necessário descomentar esta linha no seu arquivo app.php primeiro.
E então você deve criar o script de migração novamente com o comando artisan,
Desde agora, apenas as alterações feitas no ServiceProvider funcionarão.
fonte
para o laravel 5.7, escreva este código em appserviceprovider.php
fonte
Altere o conjunto de caracteres para 'utf8mb4' para 'utf8' e
agrupamento para 'utf8mb4_unicode_ci' para 'utf8_unicode_ci'
no arquivo config / database.php
Funcionou para mim.
fonte
O Laravel usa o
utf8mb4
conjunto de caracteres por padrão, que inclui suporte para armazenar "emojis" no banco de dados. Se você estiver executando uma versão do MySQL anterior à versão 5.7.7 ou MariaDB anterior à versão 10.2.2, pode ser necessário configurar manualmente o comprimento padrão da sequência gerada pelas migrações para que o MySQL crie índices para elas. Você pode configurar isso chamando oSchema::defaultStringLength
método dentro deAppServiceProvider
:Você pode conferir
https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes
fonte
É porque o Laravel 5.4 usa utf8mb4, que suporta o armazenamento de emojis.
Adicione isso no seu app \ Providers \ AppServiceProvider.php
e você deve estar pronto para ir.
fonte
Se você está atualizado ou atualizado para o Laravel 5.4 e a versão mais recente, ele funciona;
Apenas uma alteração no AppServiceProvider.php
fonte
Eu gostaria de apontar que algo que eu perdi ...
Sou novo no Laravel e não copiei o "use Illuminate ....." porque realmente não prestei atenção, porque logo acima da inicialização da função você já tem uma declaração de uso .
Espero que ajude alguém
fonte
\
Tive um problema, altere a configuração do 'config / database'
mantendo o mesmo padrão no banco de dados.
Então eu dei o comando
fonte
Em 24 de outubro de 2016, Taylor Otwell, autor do Laravel anunciado no Twitter
antes da versão 5.4, o conjunto de caracteres era
utf8
Durante este século, muitos aplicativos da web incluem bate-papo ou algum tipo de plataforma para permitir que seus usuários conversem, e muitas pessoas gostam de usar emoji ou smiley. e esse é algum tipo de super personagem que exige mais espaço para armazenar e que só é possível usar
utf8mb4
como charset . Essa é a razão pela qual eles migramutf8mb4
apenas para fins de espaço.se você procurar na
Illuminate\Database\Schema\Builder
classe, verá que$defaultStringLength
está definido como 255 e, para modificar isso, pode prosseguir pelaSchema
Fachada e chamar odefaultStringLength
método e passar o novo comprimento.para executar essa alteração, chame esse método dentro de sua
AppServiceProvider
classe, que está no subdiretório app \ provider como esteVou sugerir o uso de 191 como o valor apenas porque o MySQL suporta 767 bytes e porque
767 / 4
é o número de bytes necessários para cada caractere multibyte que você obterá.191
.Você pode saber mais aqui Os limites do conjunto de caracteres utf8mb4 (codificação UTF-8 Unicode de 4 bytes) na contagem de colunas da tabela e no tamanho da linha
fonte
191
número mágico.SOLUÇÃO:
Primeiro mude o defaultStringLength para 191, no app \ Providers \ AppServiceProvider.php :
Em seguida, altere os valores de conjunto de caracteres e agrupamento da seguinte forma, em config \ database.php :
( link para saber sobre o conjunto de caracteres MariaDB )
fonte
Indo para o seu
config/database.php
e altere o conjunto de caracteres e agrupamento de utf8mb4 para utf8Meu problema resolvido usando esse método, boa sorte cara!
fonte
Você não terá esse problema se estiver usando o MySQL 5.7.7+ ou o MariaDB 10.2.2+.
Para atualizar o MariaDB no seu Mac usando o Brew, primeiro desvincule o atual:
brew unlink mariadb
e instale um dev usandobrew install mariadb --devel
Após a conclusão da instalação, pare / inicie o serviço em execução:
brew services stop mariadb brew services start mariadb
A versão atual do desenvolvedor é 10.2.3. Após a conclusão da instalação, você não precisará mais se preocupar com isso e poderá usar o utf8mb4 (que agora é o padrão no Laravel 5.4) sem voltar ao utf8 nem editar o AppServiceProvider conforme proposto na documentação do Laravel: https: // laravel .com / docs / master / releases # laravel-5.4 (role para baixo até: Comprimento padrão da cadeia de migração )
fonte
Acabou de instalar o MariaDB 10.2.4 RC, disparou um novo projeto em branco do Laravel 5.4 e a migração padrão (colunas varchar (255)) funciona.
Não há necessidade de alterar o DB conf e o Laravael
config/database.php
. Assim, como o @scorer observou sobre o comportamento padrão para 10.2.2+.fonte
Tudo foi bem descrito nos outros. Você pode ver mais detalhes no link abaixo (pesquise com a tecla 'Index Lengths & MySQL / MariaDB ") https://laravel.com/docs/5.5/migrations
Mas bem, não é disso que se trata esta resposta! o problema é que, ao fazer o acima, você obterá outro erro (é quando você gosta do
php artisan migrate
comando launch e, devido ao problema do comprimento, a operação está presa no meio. a solução é abaixo , e a tabela do usuário é criada sem o resto ou não totalmente corretamente) , precisamos rolar bac . 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 que você é bom de ir
fonte
Defina o InnoDB do mecanismo de banco de dados:
fonte
Se você tentou todas as outras respostas e elas não funcionaram, é possível remover todas as tabelas do banco de dados e executar o comando migrate de uma só vez usando este comando:
fonte