首页 > 解决方案 > 使用教义:数据库:创建时,如何创建具有特定追逐和排序规则的数据库?

问题描述

先说短版:

我希望该命令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      |
+----------------------------+------------------------+

标签: symfonydoctrine-ormdoctrinesymfony4symfony-console

解决方案


这是另一个答案: 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';

推荐阅读