Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony Doctrine2:如何设置所有表以使用UTF8进行校对_Symfony_Doctrine Orm - Fatal编程技术网

Symfony Doctrine2:如何设置所有表以使用UTF8进行校对

Symfony Doctrine2:如何设置所有表以使用UTF8进行校对,symfony,doctrine-orm,Symfony,Doctrine Orm,我正在使用Symfony2的教义。 我的config.yml文件如下所示:- 条令结构 不幸的是,我的表没有与UTF8\u general\u ci或UTF8\u unicode\u ci进行排序 我试过了 但Doctrine2不承认这一选择 如何实现相同的功能?字符集:UTF8选项仅用于要求条令在每页上执行集合名称UTF-8。我没有任何特定的条令配置,我的表默认在utf8\u general\u ciInnoDB中。 阅读文档的这一部分:,它回答了您的问题: 不能在注释、yml或xml映射中设

我正在使用Symfony2的教义。 我的config.yml文件如下所示:-

条令结构 不幸的是,我的表没有与UTF8\u general\u ci或UTF8\u unicode\u ci进行排序 我试过了

但Doctrine2不承认这一选择


如何实现相同的功能?

字符集:UTF8选项仅用于要求条令在每页上执行
集合名称UTF-8
。我没有任何特定的条令配置,我的表默认在
utf8\u general\u ci
InnoDB中。 阅读文档的这一部分:,它回答了您的问题:

不能在注释、yml或xml映射中设置这些值 文件夹。使数据库使用默认字符集和排序规则 您应该配置MySQL将其用作默认字符集,或者创建 具有字符集和排序规则详细信息的数据库。这样他们就可以 继承到所有新创建的数据库表和列


我使用UTF8 collate(例如,使用phpmyadmin)手动创建数据库。如果我这样做,所有使用命令doctrine:schema:create创建的表都会有collate utf8。

我也有同样的问题,在阅读了doctrine项目页面后,我决定放弃使用yml文件的解决方案。

如果您使用像doctrine这样的ORMs,您可以参考这里的文档

特别是:在my.cnf中添加/编辑
[mysqld]
块(通常在/etc/my.cnf或xampp/mysql/my.cnf中找到)


我遇到了同样的问题。通过搜索代码,我在中找到了代码 供应商/doctor/dbal/lib/doctor/dbal/Platforms/MySqlPlatform.php

if ( ! isset($options['collate'])) {
  $options['collate'] = 'utf8_unicode_ci';
}
所以我把它改成了“utf8\u general\u ci”,它成功了。重建后,所有表的排序规则都更改为
utf8\u general\u ci
,但我仍然有一个问题:当我更改注释时,我收到以下错误消息:

[创建错误]在类Gvsun\UserBundle\Entity\User上声明的注释@ORM\Table没有名为“collation”的属性。可用属性:名称、架构、索引、唯一约束、选项


我搜索了条令的文档,但没有找到“选项”属性,有人能告诉我如何使用“选项”属性吗?我想它可能可以更改注释中的“整理”设置

collate的行为在理论上发生了变化:

如果不在表级别指定任何内容,则排序规则现在设置为utf8\U unicode\U ci。现在的方法是将其添加到表声明中的选项中:

/**
 * @ORM\Table(options={"collate"="utf8_swedish_ci"})
 * @ORM\Entity
 */
这将为表生成正确的排序规则:

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

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

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


来源:

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

    options:
        1002: "SET NAMES 'UTF8' COLLATE 'utf8_unicode_ci'"
看起来是这样的:

    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'"              
作为参考原则配置:

如果您使用的是MySql:

顺便说一句,我在显示波兰语字符和只添加没有排序规则的集合名方面遇到了问题(如下所示)


我已经成功地在Symfony 2.7的YML配置中使用了
选项:collate

MyBundle\Entity\Company:
    type: entity
    repositoryClass: MyBundle\Repository\CompanyRepository
    table: company
    options:
        collate: utf8_general_ci

如果您正在寻找正确创建迁移的方法,则应设置连接

您可以设置默认的_table_options连接选项以实现此目的: 在symfony中,这是通过以下方式完成的:

doctrine:
    dbal:
        default_table_options:
            charset: utf8
            collate: utf8_general_ci
对于那些希望在普通条令中执行此操作的人,这将转换为条令连接选项defaultDatabaseOptions,并与您的数据库凭据等一起传递给实体管理器:

[
    ...
    'driver' => ...
    'user' => ...
    ...
    'defaultDatabaseOptions' => [
         'charset' => 'utf8',
         'collate' => 'utf8_general_ci'
    ]
]

更新:

参见Symfony3.1手册以获取参考():

还请注意使用了utf8mb4而不是普通的utf8。(“Symfony建议针对MySQL的utf8字符集使用utf8mb4,因为它不支持4字节的unicode字符,并且包含这些字符的字符串将被截断。这由较新版本修复。”)

为MySQL设置UTF8默认值非常简单,只需在 您的配置文件(通常是my.cnf):

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


我在从数据库中获取包含波兰语字符的数据时遇到了这个问题。它看起来像:

我的config.yml类似于:

doctrine:
dbal:
    driver:   pdo_mysql
    host:     "%database_host%"
    port:     "%database_port%"
    dbname:   "%database_name%"
    user:     "%database_user%"
    password: "%database_password%"
    charset:  UTF8
    options:
         1002:  "SET NAMES 'UTF8'"
我已经找了好几个小时的答案了——我对此感到非常厌倦。“1002:设置名称‘utf8’”对我不起作用。但当我尝试从简单php脚本(出自symfony)访问我的db时,效果是一样的,但当我添加行:

mysql_query("SET NAMES 'utf8'");

它工作正常。所以这似乎有点奇怪。my db中的所有表都设置了“utf8\u unicode\u ci”。

由于DoctrineBundle 2.0,
utf8mb4
是MySQL的默认值。因此,您不再需要配置任何东西


请参阅

@ORM\Table(name=“user”,options={“collate”=“utf8\u unicode\u ci”,“charset”=“utf8”,“engine”=“InnoDB”})

谢谢@Nanocom,但我仍然很好奇。既然它只是一个需要执行的额外查询,为什么条令不允许这样的事情呢?我的意思是,对于条令来说,它只是运行一个额外的:SET name‘charset_name’COLLATE‘collation_name’;为什么它是不可配置的?它对我很重要的原因是,因为我的模式中存在完整性约束。因此,我经常需要在重新创建模式和加载装置之前删除数据库。每次都使用UTF8字符集和排序规则创建一个新的数据库是一件痛苦的事情。集合名UTF-8查询没有排序规则。您还应该正确配置MySQL服务器。在my.cnf中,您必须在[mysqld]部分的末尾添加行
字符集服务器=utf8
跳过字符集客户端握手
。并且您的完整性约束不应强制删除
MyBundle\Entity\Company:
    type: entity
    repositoryClass: MyBundle\Repository\CompanyRepository
    table: company
    options:
        collate: utf8_general_ci
doctrine:
    dbal:
        default_table_options:
            charset: utf8
            collate: utf8_general_ci
[
    ...
    'driver' => ...
    'user' => ...
    ...
    'defaultDatabaseOptions' => [
         'charset' => 'utf8',
         'collate' => 'utf8_general_ci'
    ]
]
[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
# app/config/config.yml
doctrine:
    dbal:
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci
doctrine:
dbal:
    driver:   pdo_mysql
    host:     "%database_host%"
    port:     "%database_port%"
    dbname:   "%database_name%"
    user:     "%database_user%"
    password: "%database_password%"
    charset:  UTF8
    options:
         1002:  "SET NAMES 'UTF8'"
mysql_query("SET NAMES 'utf8'");