Saltar al contenido

Cómo arreglar MySql: el tamaño de la columna de índice es demasiado grande (migración de Laravel)

Solución:

Como puede ver en el mensaje de error: “El tamaño máximo de columna es 767 bytes”, si desea crear un índice en ella. A VARCHAR(255) columna puede ocupar hasta 765 (255 * 3) bytes usando utf8 y 1020 (255 * 4) bytes usando utf8mb4. Esto se debe a que en MySQL utf8 toma hasta 3 bytes y utf8mb4 hasta 4 bytes (el UTF8 real). Creando así un VARCHAR(255) índice (único) con utf8mb4 fallará.

Estas son sus opciones para solucionar el problema:

Establecer clasificación predeterminada en my.ini:

collation_server=utf8_unicode_ci
character_set_server=utf8

Establezca la intercalación predeterminada para la base de datos al crear:

CREATE DATABASE IF NOT EXISTS `your_db` COLLATE 'utf8_unicode_ci'

Establezca la clasificación predeterminada para la tabla / columna. (No lo recomiendo)

Cambie el tamaño de la columna a 190 (varchar(190)) o menos.

Corrección de Laravel 5.4

La configuración del servidor Mysql se sobrescribe con el comando de migración de Laravel. Establecerá la intercalación y el juego de caracteres en la versión de la configuración.

Cambiar los campos charset y collation del motor db en el archivo de configuración de la base de datos ubicado en config/database.php.

..
'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            //'charset' => 'utf8mb4',
            //'collation' => 'utf8mb4_unicode_ci',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
..

Para mariadb, actualice su *my.cnf archivo con la siguiente configuración,

innodb_default_row_format=dynamic
innodb_file_format=barracuda
innodb_file_per_table=true
innodb_large_prefix=true

Entonces, tienes que reiniciar mariadb servicio para que la configuración actualizada surta efecto.

Tres soluciones, cada una con un inconveniente:

  • MySQL 5.7 evita el problema. Considere la posibilidad de actualizar.

  • VARCHAR(255) suele ser var más grande que necesario. Si puede reducir con seguridad a 191 o menos, el error desaparecerá.

  • Cambiar a utf8 (desde utf8mb4), si no necesitas chino ni emoji.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *