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 не распознал вариант.
Как я могу достичь того же?
Ответы
Ответ 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'
Ответ 4
Используйте код ниже, чтобы установить сортировку, двигатель и кодировку (пример аннотации):
/**
* @ORM\Table(
* name="temporary",
* options={"collate":"utf8_general_ci", "charset":"utf8", "engine":"MyISAM"}
* )
* @ORM\Entity
*/
Источник: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-column
Ответ 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".