0

先说短版:

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


详细版本:

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

$ bin/console doctrine:database:create

后台执行Doctrine的SQL语句为:

CREATE DATABASE `mydb`

意思是:它不使用charsetand中的collate设置,.../config/packages/doctrine.yaml并且DATABASE_URLin.../.env被忽略。

.../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: 'App\Base\Entity'
                alias: App

.../.env

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

数据库DEFAULT_CHARACTER_SET_NAMElatin1然后DEFAULT_COLLATION_NAMElatin1_swedish_ci

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      |
+----------------------------+------------------------+
4

2 回答 2

1

这是另一个答案: Doctrine2: How to set all tables to collat​​e with UTF8

他们建议在实体本身中使用 collat​​e,但是您需要像这样指定所有实体,如果您有很多实体,那就有问题了

@ORM\Table(options={"collate"="utf8mb4_unicode_ci"})

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

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

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

我的.cnf

 [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';
于 2018-06-17T09:29:14.750 回答
0

看起来,当前的学说版本(doctrine/dbal v2.10.0)不支持使用默认字符集和排序规则以外的方式创建 mysql 数据库。Symfony 命令在后台php bin/console doctrine:database:create调用。Doctrine\DBAL\Platforms\MySqlPlatform::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

所以目前不支持。

于 2020-01-20T07:28:54.173 回答