当前位置: 首页 > 知识库问答 >
问题:

如何修复MySql:索引列大小过大(Laravel migrate)

隆安然
2023-03-14

我复制了一个带有安装Debian、Nginx、PhpMyAdmin的vagrant box的项目。。在新项目中,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`))

当我做一个转储(结构数据)的工作项目数据库,并将其导入到数据库中,给出了迁移的错误,然后一切正常,它创建了所有的表和数据被导入。.

如何修复大小以便运行迁移方法

共有3个答案

赫连明诚
2023-03-14

三种解决方案,每种都有缺点:

>

VARCHAR(255)通常var比必要的要大。如果您可以安全地缩小到191或更小,错误就会消失。

如果您不需要中文或表情符号,请切换到utf8(从utf8mb4)。

尉迟华翰
2023-03-14

对于mariadb,使用以下配置更新您的*my.cnf文件,

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

然后,您必须重新启动mariadb服务,更新的配置才能生效。

傅长恨
2023-03-14

正如您在错误消息中看到的——“最大列大小为767字节”,如果您想在其上创建索引。VARCHAR(255)列使用utf8最多可占用765(255*3)字节,使用utf8mb4最多可占用1020(255*4)字节。这是因为在MySQL中,utf8最多占用3个字节,而utf8mb4最多占用4个字节(真正的utf8)。因此,使用utf8mb4创建VARCHAR(255)(唯一)索引将失败。

以下是解决问题的选项:

my.ini中设置默认排序规则:

collation_server=utf8_unicode_ci
character_set_server=utf8

在创建时为数据库设置默认归类:

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

为表/列设置默认排序规则。(我不建议那样)

将列大小更改为190(varchar(190))或更小。

Mysql服务器配置被Laravel的migration命令覆盖。它会将排序规则和字符集设置为配置的版本。

config/database.php中的数据库配置文件中,更改数据库引擎的charset排序规则字段。

..
'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,
        ],
..
 类似资料:
  • 问题内容: 我用一个无用的盒子复制了一个项目,该项目安装了Debian,Nginx,PhpMyAdmin等。在新项目中,Laravel 不再起作用,并且出现错误: 当我对工作中的项目数据库进行转储(结构+数据)并将其导入数据库中时,如果存在迁移错误,则一切正常,它将创建所有表并导入数据。 如何固定大小以便可以运行migration方法? 问题答案: 如您在错误消息中所看到的- 如果要在其上创建索引

  • 我试图迭代元素,在这里我必须为每个元素获取文本体,但在打印第一个元素体之后,下一个元素体我将获得“java.lang.IndexOutOfBoundsException:Index:1,Size:1”。我知道这是非常简单的修复,但我无法修复它。请帮助我解决此问题。 在下面的代码中,当“String text=KpiText.get(i).getText();”第二次打印时出现“java.lang.

  • 问题内容: 我想确定索引的大小,它们是主键索引。这碰巧是在mysql集群上,但我认为这并不重要。 问题答案: 我认为这就是您要寻找的。 http://dev.mysql.com/doc/refman/5.1/zh-CN/show-table- status.html

  • 问题内容: 我创建了一个表格,并意外地将length 改为。我该如何解决? 一个例子将不胜感激。 问题答案: 你有尝试过吗? 这会将 col_name 的类型更改为

  • 问题内容: 我正在尝试制作一个Java桌面应用程序,其中我要使用多个应用程序,我要设置的固定高度和宽度。我该如何实现? 这是我的代码 当我减少文本大小或文本 ,然后尺寸缩小但我想,当我减少或消除任何文字,但JLabel的大小不应该减少它应该修复 我怎么能得到这个? 提前致谢 问题答案: 您可以通过设置最小,首选和最大大小来设置固定大小: 当链接从 MadProgrammer ,你需要重写这些方法,

  • 尝试打印包含 698 个项目的 ArrayList 时收到以下错误: 我使用了以下代码,我希望收到错误: 我的问题是,如果数组的大小是698,那么max索引不应该是697吗?我不明白为什么错误给出指数:698。