Doctrine2: Как настроить все таблицы для сопоставления с UTF8 - PullRequest
24 голосов
/ 25 января 2012

Я использую Doctrine с Symfony2. Мой файл config.yml выглядит примерно так: -

Конфигурация доктрины

doctrine:
    dbal:
        driver: %database_driver%
        host: %database_host%
        port: %database_port%
        dbname: %database_name%
        user: %database_user%
        password: %database_password%
        charset: UTF8

К сожалению, мои таблицы не сопоставляются с UTF8_general_ci или UTF8_unicode_ci Я пытался

collate: utf8_unicode_ci

Но Doctrine2 не распознал этот вариант.

Как я могу добиться того же?

Ответы [ 12 ]

24 голосов
/ 08 февраля 2013

Поведение сортировки изменилось в доктрине: http://www.doctrine -project.org / jira / browse / DDC-2139

Для параметров сортировки теперь установлено значение utf8_unicode_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;

Я подал вопрос об обновлении документации, чтобы отразить это поведение.

17 голосов
/ 25 января 2012

Параметр 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-collation-for-mysql-tables , он отвечает на ваш вопрос:

Вы не можете установить эти значения в файлах аннотаций, yml или xml.Чтобы база данных работала с набором символов и параметрами сортировки по умолчанию, необходимо настроить MySQL для использования его в качестве набора символов по умолчанию или создать базу данных с подробностями набора символов и параметров сортировки.Таким образом, они наследуются всем вновь созданным таблицам и столбцам базы данных.

12 голосов
/ 12 июля 2014

Я предлагаю вам попробовать добавить этот параметр в конфигурацию Doctrine:

    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'"              

В качестве справочной конфигурации доктрины: 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

КСТАТИ. У меня были проблемы с отображением польских символов и добавление только имен наборов без сопоставления (как показано ниже).

    options:
        1002: "SET NAMES 'UTF8'
11 голосов
/ 05 июля 2016

ОБНОВЛЕНИЕ:

См. Справочник Symfony3.1 для справки ( нажмите здесь ):

Также обратите внимание на использование utf8mb4 вместо простого utf8.(«Symfony рекомендует utf8mb4 против набора символов MySQL utf8, поскольку он не поддерживает 4-байтовые символы Юникода, и строки, содержащие их, будут усечены. Это исправлено более новым набором символов utf8mb4 .»)

Установка UTF8 по умолчанию для MySQL так же проста, как добавление нескольких строк в ваш файл конфигурации (обычно 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

Вы также можете изменитьзначения по умолчанию для Doctrine, чтобы сгенерированный SQL использовал правильный набор символов.

# app/config/config.yml
doctrine:
    dbal:
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci
8 голосов
/ 13 апреля 2013

Используйте приведенный ниже код для установки параметров сортировки, механизма и набора символов (пример аннотации):

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

Источник: http://doctrine -orm.readthedocs.org / projects / doctrine-orm / en /последняя / ссылка / аннотации-reference.html # annref колонка

4 голосов
/ 26 июля 2012

Вы можете обратиться к документации здесь http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html, если вы используете ORM, такие как Doctrine.

В частности: добавление / редактирование блока [mysqld] в вашем my.cnf (обычно находится в / etc / my.cnf или xampp / mysql/my.cnf)

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
1 голос
/ 08 января 2017

У меня проблемы с извлечением данных, которые включают символы польского языка из базы данных.Это выглядит так:

эффекты отображения данных из db

мой 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: SET NAMES 'utf8'" Не работает для меня.Но когда я попытался получить доступ к своей базе данных из простого php-скрипта (из symfony), эффект был таким же, но когда я добавил строку:

mysql_query("SET NAMES 'utf8'");

, она работала правильно.Так что это кажется немного странным.Все таблицы в моей базе данных имеют набор utf8_unicode_ci.

1 голос
/ 14 ноября 2012

Я встретил те же проблемы. По поиску кода я нахожу код в продавец / Доктрина / DBAL / Библиотека / Doctrine / DBAL / Платформы / MySqlPlatform.php

if ( ! isset($options['collate'])) {
  $options['collate'] = 'utf8_unicode_ci';
}

Так что я изменил его на 'utf8_general_ci', и это сработало. После перестройки все параметры сортировки таблиц изменились на utf8_general_ci, но у меня все еще остается один вопрос: при изменении аннотаций я получаю следующее сообщение об ошибке:

[Ошибка создания] Аннотация @ORM \ Table, объявленная для класса Gvsun \ UserBundle \ Entity \ User, не имеет свойства с именем "collation". Доступные свойства: имя, схема, индексы, уникальные ограничения, опции

Я ищу документацию по Doctrine, но не нашел свойства 'option', может кто-нибудь сказать мне, как использовать свойство options, я думаю, что оно может изменить параметры сортировки в настройках аннотаций?

0 голосов
/ 02 мая 2016

если вы ищете способ правильного создания миграций, вам нужно настроить соединение

вы можете установить опцию соединения default_table_options, чтобы добиться этого: в Symfony это делается через:

doctrine:
    dbal:
        default_table_options:
            charset: utf8
            collate: utf8_general_ci

для тех, кто хочет сделать это в простой доктрине, это преобразуется в параметр подключения доктрины defaultDatabaseOptions и передается менеджеру сущностей вместе с вашими учетными данными базы данных и т. Д .:

[
    ...
    'driver' => ...
    'user' => ...
    ...
    'defaultDatabaseOptions' => [
         'charset' => 'utf8',
         'collate' => 'utf8_general_ci'
    ]
]
0 голосов
/ 12 июня 2015

Я успешно использовал options: collate в конфигурации YML Symfony 2.7.

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