Sve*_*len 16 mysql indexing vagrant laravel-5
我复制了一个带有流浪盒的项目,它安装了Debian,Nginx,PhpMyAdmin,..随着新项目,Laravel php artisan migrate不再工作,我得到错误:
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1709 Index column size too large. The maximum column size is 767 bytes. (SQL: alter table `courses` add unique `courses_name_unique`(`na
me`))
Run Code Online (Sandbox Code Playgroud)
当我创建工作项目数据库的转储(结构+数据)并将其导入数据库时给出迁移时的错误,然后一切正常,它创建所有表和数据导入..
如何修复大小以便我可以运行migrate方法?
Pau*_*gel 40
正如您在错误消息中看到的那样 - "最大列大小为767字节",如果要在其上创建索引.一VARCHAR(255)列可使用最多765(255*3)字节,使用utf81020(255*4)字节utf8mb4.这是因为在MySQL utf8中最多需要3个字节,utf8mb4最多4个字节(真正的UTF8).因此,创建VARCHAR(255)(唯一)索引utf8mb4将失败.
这是解决问题的方法:
设置默认排序规则my.ini:
collation_server=utf8_unicode_ci
character_set_server=utf8
Run Code Online (Sandbox Code Playgroud)
创建时为数据库设置默认排序规则:
CREATE DATABASE IF NOT EXISTS `your_db` COLLATE 'utf8_unicode_ci'
Run Code Online (Sandbox Code Playgroud)
设置表/列的默认排序规则.(我不推荐)
将列大小更改为190(varchar(190))或更小.
Laravel的迁移命令覆盖了Mysql服务器配置.它会将排序规则和字符集设置为配置的版本.
更改位于的数据库配置文件中的字段charset和collation数据库引擎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,
],
..
Run Code Online (Sandbox Code Playgroud)
Pra*_*tik 11
对于mariadb,请*my.cnf使用以下配置更新文件,
innodb_default_row_format=dynamic
innodb_file_format=barracuda
innodb_file_per_table=true
innodb_large_prefix=true
Run Code Online (Sandbox Code Playgroud)
然后,您必须重新启动mariadb服务以使更新的配置生效。
对于 Laravel 5.5 或更高版本,将 config/database.php 文件引擎更改为 InnoDB ROW_FORMAT=DYNAMIC:
'connections' => [
...
'mysql' => [
...
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
]]
Run Code Online (Sandbox Code Playgroud)
感谢 laracasts:https://laracasts.com/discuss/channels/eloquent/migrations-and-table-options-row-format
三种解决方案,每种都有缺点:
MySQL 5.7避免了这个问题。考虑升级。
VARCHAR(255)通常var大于必要值。如果您可以安全地缩小到191以下,错误将消失。
如果不需要中文或表情符号,请切换到utf8(来自utf8mb4)。
小智 6
在 中App\Providers\AppServiceProvider.php,导入Schema:
use Illuminate\Support\Facades\Schema;
Run Code Online (Sandbox Code Playgroud)
并在boot()函数中添加这一行:
Schema::defaultStringLength(191);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32126 次 |
| 最近记录: |