【问题标题】:Symfony 4 SQLSTATE[42000] Specified key was too longSymfony 4 SQLSTATE [42000] 指定的键太长
【发布时间】:2018-11-19 03:50:51
【问题描述】:

我正在尝试从 Symfony 4 中的实体创建数据库。但是结果是:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

我知道这是因为它试图使用 utf8mb4 字符集和 utf8mb4_unicode_ci 排序规则。我尝试将我的学说.yaml 文件替换为 utf8 和 utf8_unicode_ci 以及:

@ORM\Table(name="users", options={"collate"="utf8_unicode_ci", "charset"="utf8", "engine"="MyISAM"})

但它仍在尝试使用 utf88mb4。如何强制它使用 utf8?

【问题讨论】:

  • 不要使用 MyISAM。查看 767 个解决方法here

标签: mysql symfony utf-8 doctrine-orm orm


【解决方案1】:

您好,我遇到了同样的错误: SQLSTATE[42000]:语法错误或访问冲突:1071 指定的键太长;最大密钥长度为 767 字节

我通过将 length 更改为 191 来修复它,如下所示: @ORM\Column(type="string", length=191, unique=true)

【讨论】:

    【解决方案2】:

    错误在 PDOConnection.php 第 88 行: SQLSTATE [42000]:语法错误或访问冲突:1071 指定的键是 t 太长了;最大密钥长度为 767 字节

    框架:Symfony 4.4

    解决方案

    更新文件 config/doctrine.yaml

    教义: 分贝: url: '%env(resolve:DATABASE_URL)%' 服务器版本:'5.0' 字符集:utf8 默认表选项: 字符集:utf8 整理:utf8_unicode_ci

    【讨论】:

      【解决方案3】:

      好的,我找到了答案,所以基本上我有很多迁移文件,而 php 一直在尝试使用旧配置创建数据库。为了正确创建它,我删除了 Migrations 目录并使用了

      php bin/console doctrine:cache:clear-metadata.

      这有帮助,现在创建者使用了新配置。

      【讨论】:

      • 不幸的是,这不是一个完整的答案。我对 Symfony 迁移生成的 SQL 代码有同样的问题,但我直接在数据库上运行代码。我认为 Doctrine 存在一个潜在的问题。
      【解决方案4】:

      我们已将“config/doctrine.yaml”中的“server_version”更新为“mariadb-10.1.34”,将“charset”更新为“utf8mb4”。更新后我们必须运行以下命令:

      php bin/console doctrine:schema:drop
      php bin/console doctrine:schema:create
      php bin/console doctrine:schema:validate
      

      这是“config/doctrine.yaml”供您参考。

      doctrine:
        dbal:
          url: "%env(resolve:DATABASE_URL)%"
          server_version: "mariadb-10.1.34"
          charset: utf8
          default_table_options:
            charset: utf8
            collate: utf8_unicode_ci
        orm:
          auto_generate_proxy_classes: true
          naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
          auto_mapping: true
          mappings:
            App:
              is_bundle: false
              type: annotation
              dir: "%kernel.project_dir%/src/Entity"
              prefix: 'App\Entity'
              alias: App
      

      参考:https://github.com/symfony/symfony/issues/27166#issuecomment-524041055

      【讨论】:

        【解决方案5】:

        这是我的解决方案:

        在 VARCHAR 上将 255 更改为 191 -- 您会丢失任何超过 191 个字符的值(不太可能?);

        Reference

        【讨论】:

          猜你喜欢
          • 2021-02-28
          • 2019-10-11
          • 2018-09-28
          • 2016-06-19
          • 2013-02-02
          • 2019-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多