Подтвердить что ты не робот

Doctrine2: Как установить все таблицы для сопоставления с UTF8

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

Конфигурация Doctrine

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 не распознал вариант.

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

4b9b3361

Ответ 1

Параметр 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 для использования в качестве кодировки по умолчанию или создать базы данных с деталями и деталями сортировки. Таким образом, они получают наследуется ко всем вновь созданным таблицам и столбцам базы данных.

Ответ 2

Поведение сортировки изменилось в доктрине: 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;

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

Ответ 3

Я предлагаю вам попробовать добавить этот параметр в конфигурацию 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

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

    options:
        1002: "SET NAMES 'UTF8'

Ответ 5

ОБНОВЛЕНИЕ:

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

Также обратите внимание на использование utf8mb4 вместо простого utf8. ( "Symfony рекомендует utf8mb4 для набора символов MySQL utf8, поскольку он не поддерживает 4-байтные символы Unicode, а строки, содержащие их, будут усечены. Это исправлено с помощью нового набор символов 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

Ответ 6

Вы можете обратиться к документации здесь 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

Ответ 7

Я встретил те же проблемы. Просматривая код, я нахожу код в поставщик/доктрина/DBAL/Library/Учение/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". Доступные свойства: имя, схема, индексы, uniqueConstraints, options

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

Ответ 8

Я создаю вручную свою базу данных с помощью сопоставления UTF8 (например, с phpmyadmin). Если я это сделаю, все таблицы создадут с помощью команды doctrine: schema: create будет иметь collate utf8.

Ответ 9

У меня была такая же проблема, и после прочтения этой документации на странице проекта доктрины я решил отказаться от решения с yml файлом.

Ответ 10

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

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

Ответ 11

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

вы можете установить опцию подключения по умолчанию_table_options для достижения этого: в symfony это делается через:

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

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

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

Ответ 12

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

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

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

mysql_query("SET NAMES 'utf8'");

он работал правильно. Так что это кажется немного странным. Все таблицы в моем db имеют набор "utf8_unicode_ci".