使用doctrine:database:create时,如何创建具有特定chaset和排序规则的数据库?



先是简短的版本:

我希望命令doctrine:database:create使用正确/定义的字符集和排序规则创建数据库。如何实现?(在最好的情况下,无需更改服务器上的任何全局设置。


详细版本:

上下文是Symfony 4应用程序和Doctrine 2。DBMS:MySQL,操作系统:Ubuntu 14.04。我想用教义创建数据库:

$ bin/console doctrine:database:create

在后台执行的 SQL 语句 Doctrine 是:

CREATE DATABASE `mydb`

意味着:它不使用.../config/packages/doctrine.yaml中的charsetcollate设置,并且忽略.../.env中的DATABASE_URL

.../config/packages/doctrine.yaml

parameters:
env(DATABASE_URL): ''
doctrine:
dbal:
# configure these for your database server
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
# With Symfony 3.3, remove the `resolve:` prefix
url: '%env(resolve:DATABASE_URL)%'
mapping_types:
enum: string
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Base/Entity'
prefix: 'AppBaseEntity'
alias: App

.../.env

###> doctrine/doctrine-bundle ###
DATABASE_URL=mysql://root:pwd@127.0.0.1:3306/mydb?charset=utf8mb4
###< doctrine/doctrine-bundle ###

然后latin1数据库DEFAULT_CHARACTER_SET_NAMElatin1_swedish_ciDEFAULT_COLLATION_NAME

SELECT
`DEFAULT_CHARACTER_SET_NAME`, `DEFAULT_COLLATION_NAME`
FROM
information_schema.SCHEMATA 
WHERE
schema_name = 'mydb'
;
+----------------------------+------------------------+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| latin1                     | latin1_swedish_ci      |
+----------------------------+------------------------+

这里有一些另一个答案: 原则 2:如何设置所有表以使用 UTF8 进行整理

他们建议在实体本身中使用 collate,但您需要像这样指定所有实体,如果您有很多,这是一个问题

@ORMTable(options={"collate"="utf8mb4_unicode_ci"})

第二种方法是在doctrine.yml中使用选项

doctrine:
dbal:
options:
1002: "SET NAMES 'utf8mb4_unicode_ci'" 

第三种解决方案是编辑 mysql 配置文件并在那里添加默认字符集。

我的网富

[mysqld]
character-set-server=utf8mb4_unicode_ci
collation-server=utf8mb4_unicode_ci

MySQL 全局变量(用于当前会话(

SET GLOBAL `character_set_server` = 'utf8mb4';
SET GLOBAL `collation_server` = 'utf8mb4_unicode_ci';

看起来,当前的 doctrine 版本(doctrine/dbal v2.10.0(不支持使用默认字符集和排序规则以外的其他方式创建 mysql 数据库。Symfony 命令php bin/console doctrine:database:create在后台调用DoctrineDBALPlatformsMySqlPlatform::getCreateDatabaseSQL()

public function getCreateDatabaseSQL($name)
{
return 'CREATE DATABASE ' . $name;
}

请参阅 https://github.com/doctrine/dbal/blob/c950aab16457b1b4fd4b0f78b976fbdec373473a/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php#L352

没有从Symfony配置树添加字符集或排序规则:-(为什么不呢?^^

doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
driver: 'mysql'
server_version: '5.7'
# Only needed for MySQL (ignored otherwise)
charset: utf8mb4
default_table_options:
collate: utf8mb4_unicode_ci

所以目前不支持它。

相关内容

  • 没有找到相关文章

最新更新