Doctrine2:如何将所有表设置为与UTF8进行整理

Ami*_*mit 25 symfony doctrine-orm

我正在使用Sytrfony2的Doctrine.我的config.yml文件看起来像这样: -

学说配置

doctrine:
    dbal:
        driver: %database_driver%
        host: %database_host%
        port: %database_port%
        dbname: %database_name%
        user: %database_user%
        password: %database_password%
        charset: UTF8
Run Code Online (Sandbox Code Playgroud)

不幸的是我的表没有整理到我试过的UTF8_general_ci或UTF8_unicode_ci

collate: utf8_unicode_ci
Run Code Online (Sandbox Code Playgroud)

但是Doctrine2并不承认这个选择.

我怎样才能实现同样的目标?

小智 25

整理的行为在学说中发生了变化:http://www.doctrine-project.org/jira/browse/DDC-2139

如果您未在表级别指定任何内容,则排序规则现在设置为utf8_unicode_ci.现在的方法是将它添加到表声明中的选项:

/**
 * @ORM\Table(options={"collate"="utf8_swedish_ci"})
 * @ORM\Entity
 */
Run Code Online (Sandbox Code Playgroud)

这将为表生成正确的排序规则:

$ php app/console doctrine:schema:update --dump-sql --env=test | grep swedish
...  DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci ENGINE = InnoDB;
Run Code Online (Sandbox Code Playgroud)

我已经提交了一个问题,要更新文档以反映此行为.

  • 作为注释 - 此语法仅适用于初始表创建.如果您需要更改现有表的排序规则,则必须先将其删除.检查它[实际如何工作](https://github.com/doctrine/dbal/blob/6fb7312d208c9d6f45015953f367e5c33b2bdd5a/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php#L475-L478) (2认同)

Nan*_*com 17

charset: UTF8选项对于让Doctrine SET NAMES UTF-8在每个页面上执行非常有用.我没有Doctrine的任何特定配置,我的表默认在utf8_general_ci InnoDB中.阅读文档的这一部分:http://www.doctrine-project.org/docs/orm/2.1/en/reference/faq.html#how-do-i-set-the-charset-and-collat​​ion-for -mysql-tables,它回答你的问题:

您无法在注释,yml或xml映射文件中设置这些值.要使数据库使用默认的字符集和排序规则,您应该将MySQL配置为使用默认字符集,或者使用字符集和排序规则详细信息创建数据库.这样,它们就会继承到所有新创建的数据库表和列.

  • 不,这是错的!可以设置整理,表名,编码和表引擎,这样我就无法理解为什么这个错误的答案会得到很多声音.正确答案给出了Rickard2(http://stackoverflow.com/a/14769520/1225291).设置它们就像这个选项= {"collat​​e"="utf16_latin_ci","charset"="utf16","引擎"="MyISAM"} (3认同)
  • SET NAMES UTF-8查询没有排序规则.您也应该正确配置MySQL服务器.在你的my.cnf中,你必须在[mysqld]部分的末尾添加`character-set-server = utf8`和`skip-character-set-client-handshake`. (2认同)

小智 12

我建议您尝试将此设置添加到您的Doctrine配置中:

    options:
        1002: "SET NAMES 'UTF8' COLLATE 'utf8_unicode_ci'"
Run Code Online (Sandbox Code Playgroud)

所以它看起来像这样:

    doctrine:
        dbal:
            driver: %database_driver%
            host: %database_host%
            port: %database_port%
            dbname: %database_name%
            user: %database_user%
            password: %database_password%
            charset: UTF8
            options:
                1002: "SET NAMES 'UTF8' COLLATE 'utf8_unicode_ci'"              
Run Code Online (Sandbox Code Playgroud)

作为参考Doctrine配置:http: //symfony.com/doc/2.0/reference/configuration/doctrine.html#reference-dbal-configuration

如果您使用的是MySql:http: //dev.mysql.com/doc/refman/5.0/en/charset-connection.html

BTW.我在显示波兰字符时遇到了问题,并且只添加了没有整理的设置名称(如下所示).

    options:
        1002: "SET NAMES 'UTF8'
Run Code Online (Sandbox Code Playgroud)


Dev*_*vWL 11

更新:

请参阅Symfony3.1书籍以供参考(单击此处):

另请注意使用utf8mb4而不是普通的utf8.("Symfony建议utf8mb4对抗MySQL的utf8字符集,因为它不支持4字节的unicode字符,并且包含它们的字符串将被截断.这由较新的utf8mb4字符集修复.")

设置MySQL的UTF8默认值就像在配置文件中添加几行一样简单(通常是my.cnf):

[mysqld]
# Version 5.5.3 introduced "utf8mb4", which is recommended
collation-server     = utf8mb4_general_ci # Replaces utf8_general_ci
character-set-server = utf8mb4            # Replaces utf8
Run Code Online (Sandbox Code Playgroud)

您还可以更改Doctrine的默认值,以便生成的SQL使用正确的字符集.

# app/config/config.yml
doctrine:
    dbal:
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci
Run Code Online (Sandbox Code Playgroud)


Igo*_*zma 8

使用下面的代码设置排序规则,引擎和字符集(注释示例):

/**
* @ORM\Table(
*     name="temporary", 
*     options={"collate":"utf8_general_ci", "charset":"utf8", "engine":"MyISAM"}
* )  
* @ORM\Entity
*/    
Run Code Online (Sandbox Code Playgroud)

资料来源:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-column