【问题标题】:How to create a database with a specific chaset and collation, when using doctrine:database:create?使用教义:数据库:创建时,如何创建具有特定字符集和排序规则的数据库?
【发布时间】:2018-06-16 13:45:22
【问题描述】:

先说短版:

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


详细版本:

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

$ bin/console doctrine:database:create

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

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: '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_NAMElatin1DEFAULT_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      |
+----------------------------+------------------------+

【问题讨论】:

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


    【解决方案1】:

    这里有一些其他的答案: Doctrine2: How to set all tables to collate with UTF8

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

    @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 全局变量(用于当前会话)

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

    【讨论】:

    • 感谢您的回答!解决方案: 1. 我想避免为每个表显式设置字符集。我想在数据库级别上有这个。 2. 选项1002 不适合我。 1002: "SET NAMES 'utf8mb4_unicode_ci'" 导致 DB 错误 (An exception occurred in driver: SQLSTATE[42000] [1115] Unknown character set: 'utf8mb4_unicode_ci')。所以我把它改成了utf8mb4。没有错误,但也没有效果——数据库是使用字符集 latin1 和排序规则 latin1_swedish_ci 创建的。 3.my.cnf中的这些设置似乎被忽略了。有效的是SET GLOBAL
    • @automatix 像这样? 1002:“设置全球‘utf8mb4_unicode_ci’”?发布我们的答案,您是如何做到的 :)
    • 刚刚更新了您的答案。但实际上这是我想要避免的——服务器范围的更改。
    【解决方案2】:

    看起来,当前的学说版本(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
    

    所以目前不支持。

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2013-05-31
      • 2010-11-16
      • 1970-01-01
      • 2012-12-03
      相关资源
      最近更新 更多