web-dev-qa-db-fra.com

Doctrine2: Comment définir toutes les tables pour qu'elles soient assemblées avec UTF8

J'utilise Doctrine avec Symfony2. Mon fichier config.yml ressemble à ceci: -

Configuration de la doctrine

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?

24
Amit

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.

17
Nanocom

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.

24
rickard2

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'
12
v0rin

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
11
DevWL

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
*/    

Source: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-column

8
Igor Vizma

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
4
Amit

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

1
skuteq

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?

1
Marco Chen

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'
    ]
]
0
esserj

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.

0
Dawid Job

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
0
Sithu

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.

0
smoreno