先是简短的版本:
我希望命令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
中的charset
和collate
设置,并且忽略.../.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_NAME
,latin1_swedish_ci
DEFAULT_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
所以目前不支持它。