Doctrine table migrations_versions 专栏长度
Doctrine table migrations_versions column length
在带有 Doctrine Migrations 2.2.0 的 Symfony 5 上,我想执行一个自定义的 Doctrine 迁移文件。
我的实体是使用 InnoDB utf8mb4_unicode_ci 创建的(doctrine.yaml 中的默认值)。
当我执行 bin/console doctrine:migrations:status --show-versions
时,我得到:
An exception occurred while executing 'CREATE TABLE migration_versions (version VARCHAR(1024) NOT NULL, executed_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)', PRIMARY KEY(version)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB':
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 3072 bytes
所以我修改 doctrine_migrations.yaml 并将 version_column_length 的值更改为 255 但现在使用相同的命令我得到
In BaseNode.php line 425:
Invalid configuration for path "doctrine_migrations.storage.table_storage.version_column_length": The minimum length for the version column is 1024.
In ExprBuilder.php line 187:
The minimum length for the version column is 1024.
可以将自动创建的实体 tables 的 varchar 长度更改为 1024,因此这不是我的数据库的限制。
我怎样才能自动创建具有适当列长度的 migrations_versions table?
config/packages/doctrine.yaml
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
mapping_types:
enum: string
# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
#server_version: '5.7'
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
config/packages/doctrine_migrations.yaml
doctrine_migrations:
migrations_paths:
'DoctrineMigrations': '%kernel.project_dir%/src/Migrations'
storage:
table_storage:
table_name: 'migration_versions'
version_column_name: 'version'
version_column_length: 1024
executed_at_column_name: 'executed_at'
我的同事通过简单地注释该行找到了解决方案
version_column_length: 1024
发生这种情况是因为所使用的 MySQL 版本中的密钥长度限制。对于旧版本的 MySQL 可能会更小,并且还取决于所使用的排序规则。您必须检查您正在使用的 MySQL 版本以找到允许的最大密钥长度,然后找到可以与正在使用的排序规则一起使用的列的最大大小。该长度可以在学说迁移的配置文件中的选项 version_column_length 中使用(例如:migrations.php 或 migrations.xml 等...) .
关于密钥最大长度的详细解释可以在以下问题的答案中找到。
Specified key was too long; max key length is 767 bytes
在我的例子中,它被限制为 191,因为我使用的是 MySQL 5.6
在带有 Doctrine Migrations 2.2.0 的 Symfony 5 上,我想执行一个自定义的 Doctrine 迁移文件。 我的实体是使用 InnoDB utf8mb4_unicode_ci 创建的(doctrine.yaml 中的默认值)。
当我执行 bin/console doctrine:migrations:status --show-versions
时,我得到:
An exception occurred while executing 'CREATE TABLE migration_versions (version VARCHAR(1024) NOT NULL, executed_at DATETIME NOT NULL COMMENT '(DC2Type:datetime_immutable)', PRIMARY KEY(version)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB':
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 3072 bytes
所以我修改 doctrine_migrations.yaml 并将 version_column_length 的值更改为 255 但现在使用相同的命令我得到
In BaseNode.php line 425:
Invalid configuration for path "doctrine_migrations.storage.table_storage.version_column_length": The minimum length for the version column is 1024.
In ExprBuilder.php line 187:
The minimum length for the version column is 1024.
可以将自动创建的实体 tables 的 varchar 长度更改为 1024,因此这不是我的数据库的限制。 我怎样才能自动创建具有适当列长度的 migrations_versions table?
config/packages/doctrine.yaml
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
mapping_types:
enum: string
# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
#server_version: '5.7'
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
config/packages/doctrine_migrations.yaml
doctrine_migrations:
migrations_paths:
'DoctrineMigrations': '%kernel.project_dir%/src/Migrations'
storage:
table_storage:
table_name: 'migration_versions'
version_column_name: 'version'
version_column_length: 1024
executed_at_column_name: 'executed_at'
我的同事通过简单地注释该行找到了解决方案
version_column_length: 1024
发生这种情况是因为所使用的 MySQL 版本中的密钥长度限制。对于旧版本的 MySQL 可能会更小,并且还取决于所使用的排序规则。您必须检查您正在使用的 MySQL 版本以找到允许的最大密钥长度,然后找到可以与正在使用的排序规则一起使用的列的最大大小。该长度可以在学说迁移的配置文件中的选项 version_column_length 中使用(例如:migrations.php 或 migrations.xml 等...) .
关于密钥最大长度的详细解释可以在以下问题的答案中找到。
Specified key was too long; max key length is 767 bytes
在我的例子中,它被限制为 191,因为我使用的是 MySQL 5.6