在使用doctrine:database:create时,如何使用特定的chaset和collat​​ion创建数据库?

时间:2018-06-16 13:45:22

标签: symfony doctrine-orm doctrine symfony4 symfony-console

首先是简短版本:

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

详细版本:

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

$ bin/console doctrine:database:create

后台执行的SQL语句是:

CREATE DATABASE `mydb`

表示:它不会使用charset中的collate.../config/packages/doctrine.yaml设置,也会忽略DATABASE_URL中的.../.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_NAME然后是latin1,而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      |
+----------------------------+------------------------+

1 个答案:

答案 0 :(得分:0)

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

他们建议在实体本身使用整理,但是你需要指定所有这样的entites,如果你有很多这样的,那就是一个问题

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

第二种方法是使用doctrine.yml

中的选项
 doctrine:
  dbal:
        options:
            1002: "SET NAMES 'utf8mb4_unicode_ci'" 

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

<强>的my.cnf

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

MySQL GLOBAL VARIABLES (对于当前会话)

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