J'utilise Doctrine avec Symfony2. Mon fichier config.yml ressemble à ceci: -
doctrine:
dbal:
driver: %database_driver%
Host: %database_Host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
Malheureusement, mes tables ne sont pas assemblées avec UTF8_general_ci ou UTF8_unicode_ci que j'ai essayé
collate: utf8_unicode_ci
Mais Doctrine2 n'a pas reconnu l'option.
Comment puis-je réaliser la même chose?
L'option charset: UTF8
Est juste utile pour demander Doctrine d'exécuter SET NAMES UTF-8
Sur chaque page. Je n'ai pas de configuration spécifique pour Doctrine, et mes tables sont par défaut dans utf8_general_ci InnoDB. Lisez cette partie de la documentation: http://www.doctrine-project.org/docs/orm/2.1/en/reference/faq.html#how-do-i-set -the-charset-and-collation-for-mysql-tables , il répond à votre question:
Vous ne pouvez pas définir ces valeurs dans les annotations, les fichiers de mappage yml ou xml. Pour faire fonctionner une base de données avec le jeu de caractères et le classement par défaut, vous devez configurer MySQL pour l'utiliser comme jeu de caractères par défaut, ou créer la base de données avec les détails du jeu de caractères et du classement. De cette façon, ils sont hérités de toutes les tables et colonnes de base de données nouvellement créées.
Le comportement de l'assemblage a changé dans la doctrine: http://www.doctrine-project.org/jira/browse/DDC-2139
Le classement est désormais défini sur utf8_unicode_ci si vous ne spécifiez rien au niveau de la table. La voie à suivre maintenant est de l'ajouter aux options de votre déclaration de table:
/**
* @ORM\Table(options={"collate"="utf8_swedish_ci"})
* @ORM\Entity
*/
Cela générera le classement correct pour la table:
$ php app/console doctrine:schema:update --dump-sql --env=test | grep swedish
... DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci ENGINE = InnoDB;
J'ai signalé un problème de mise à jour de la documentation pour refléter ce comportement.
Je vous suggère d'essayer d'ajouter ce paramètre à votre configuration Doctrine:
options:
1002: "SET NAMES 'UTF8' COLLATE 'utf8_unicode_ci'"
Cela ressemble donc à ceci:
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'"
Comme référence Doctrine Configuration: http://symfony.com/doc/2.0/reference/configuration/doctrine.html#reference-dbal-configuration
Et au cas où vous utilisez MySql: http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
BTW. J'ai eu des problèmes avec l'affichage des caractères polonais et l'ajout de noms de jeux uniquement sans classement (comme ci-dessous) a aidé.
options:
1002: "SET NAMES 'UTF8'
MISE À JOUR:
Voir le livre Symfony3.1 pour référence ( cliquez ici ):
Notez également l'utilisation de utf8mb4 au lieu de utf8 ordinaire. ("Symfony recommande utf8mb4 par rapport au jeu de caractères utf8 de MySQL, car il ne prend pas en charge les caractères unicode à 4 octets, et les chaînes les contenant seront tronquées. Ceci est corrigé par le plus récent jeu de caractères utf8mb4 .")
La définition des valeurs par défaut UTF8 pour MySQL est aussi simple que l'ajout de quelques lignes à votre fichier de configuration (généralement 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
Vous pouvez également modifier les valeurs par défaut pour Doctrine afin que le SQL généré utilise le jeu de caractères correct.
# app/config/config.yml
doctrine:
dbal:
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
Utilisez le code ci-dessous pour définir le classement, le moteur et le jeu de caractères (exemple d'annotation):
/**
* @ORM\Table(
* name="temporary",
* options={"collate":"utf8_general_ci", "charset":"utf8", "engine":"MyISAM"}
* )
* @ORM\Entity
*/
Vous pouvez vous référer à la documentation ici http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html si vous utilisez des ORM comme Doctrine.
En particulier: ajouter/éditer le [mysqld]
bloquer dans votre my.cnf (généralement trouvé dans /etc/my.cnf ou xampp/mysql/my.cnf)
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
J'ai ce problème avec la récupération de données qui inclut des caractères polonais à partir de la base de données. On dirait:
effets de l'affichage des données de la base de données
mon config.yml est comme:
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'"
et je cherchais une réponse depuis quelques heures - Je suis tellement fatigué de cela. "1002: SET NAMES 'utf8'" Ne fonctionne pas pour moi. Mais quand j'ai essayé d'accéder à ma base de données à partir d'un simple script php (hors symfony), l'effet était le même mais quand j'ai ajouté une ligne:
mysql_query("SET NAMES 'utf8'");
cela a fonctionné correctement. Cela semble donc peu étrange. Toutes les tables de ma base de données ont défini "utf8_unicode_ci".
J'ai rencontré les mêmes problèmes. En recherchant le code, je trouve le code dans vendeur/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php
if ( ! isset($options['collate'])) {
$options['collate'] = 'utf8_unicode_ci';
}
Je l'ai donc changé en "utf8_general_ci", et cela a fonctionné. Le classement de tous les tableaux a été remplacé par utf8_general_ci
après la reconstruction, mais j'ai encore une question: lorsque j'ai modifié les annotations, j'ai reçu le message d'erreur suivant:
[Erreur de création] L'annotation @ORM\Table déclarée sur la classe Gvsun\UserBundle\Entity\User n'a pas de propriété nommée "collation". Propriétés disponibles: nom, schéma, index, uniqueConstraints, options
Je recherche dans la documentation de Doctrine, mais je n'ai pas trouvé la propriété 'option', quelqu'un peut-il me dire comment utiliser la propriété options, je pense qu'il pourrait être en mesure de modifier l'assemblage dans les paramètres d'annotations?
si vous cherchez un moyen de créer correctement les migrations, vous devez configurer la connexion
vous pouvez définir l'option de connexion default_table_options pour y parvenir: dans symfony cela se fait par:
doctrine:
dbal:
default_table_options:
charset: utf8
collate: utf8_general_ci
pour ceux qui cherchent à le faire en clair doctrine cela se traduit par doctrine option de connexion defaultDatabaseOptions, et est transmis au gestionnaire d'entité avec vos informations d'identification de base de données, etc.:
[
...
'driver' => ...
'user' => ...
...
'defaultDatabaseOptions' => [
'charset' => 'utf8',
'collate' => 'utf8_general_ci'
]
]
J'ai eu le même problème, et après avoir lu cette documentation de doctrine page du projet, j'ai décidé d'abandonner la solution avec le fichier yml.
J'ai utilisé avec succès options: collate
dans la configuration YML de Symfony 2.7.
MyBundle\Entity\Company:
type: entity
repositoryClass: MyBundle\Repository\CompanyRepository
table: company
options:
collate: utf8_general_ci
Je crée manuellement ma base de données avec avec UTF8 collate (ex. Avec phpmyadmin). Si je fais cela, toutes les tables créent avec la commande doctrine: schema: create aura collate utf8.