2012-01-25 1 views
22

Sto usando Doctrine con Symfony2. Il mio file config.yml simile a questa: -Doctrine2: Come impostare tutte le tabelle da confrontare con UTF8

Dottrina configurazione

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

Purtroppo le mie tabelle non vengono collazione al utf8_general_ci o utf8_unicode_ci ho provato

collate: utf8_unicode_ci 

Ma Doctrine2 didn' t riconoscere l'opzione.

Come posso ottenere lo stesso?

risposta

15

L'opzione charset: UTF8 è utile per chiedere a Doctrine di eseguire SET NAMES UTF-8 su ciascuna pagina. Non ho alcuna configurazione specifica per Doctrine e le mie tabelle sono di default in utf8_general_ci InnoDB. Leggere questa parte della documentazione: http://www.doctrine-project.org/docs/orm/2.1/en/reference/faq.html#how-do-i-set-the-charset-and-collation-for-mysql-tables, che risponde alla tua domanda:

Non è possibile impostare questi valori all'interno delle annotazioni, yml o XML di mappatura file. Per far funzionare un database con il set di caratteri e le regole di confronto predefiniti , è necessario configurare MySQL per utilizzarlo come set di caratteri predefinito o creare il database con i set di caratteri e i dettagli di confronto. In questo modo ricevono ereditato su tutte le tabelle e le colonne del database appena create.

+0

Grazie a @Nanocom, ma mi sto ancora chiedendo. Dato che è solo una query extra che deve essere eseguita, perché la dottrina non dovrebbe consentire qualcosa di simile. – Amit

+0

??? Non ho capito il tuo punto. – Nanocom

+0

Voglio dire, per doctrine si tratta solo di eseguire un ulteriore: SET NAMES 'charset_name' COLLATE 'nome_collazione'; Perché non è configurabile? Il motivo per cui è importante per me è perché ci sono vincoli di integrità nel mio schema. Quindi ho spesso bisogno di abbandonare il mio database prima di ricreare lo schema e caricare i dispositivi. È un problema creare e creare un nuovo database con charset e fascicolazione UTF8 ogni volta. – Amit

0

Creo manualmente la mia base di dati con la raccolta UTF8 (ad esempio con phpmyadmin). Se faccio questo, tutte le tabelle creano con doctrine di comando: schema: create avrà collf utf8.

+0

Certo, grazie @smoreno, per ora l'ho fatto anche io. Ma sto cercando una soluzione configurabile. – Amit

0

Avevo lo stesso problema e, dopo aver letto this documentation dalla pagina del progetto di doctrine, ho deciso di abbandonare la soluzione con il file yml.

3

È possibile fare riferimento alla documentazione qui http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html se si utilizzano ORM come Doctrine.

In particolare: l'aggiunta/modifica del blocco [mysqld] nel vostro my.cnf (di solito si trova in /etc/my.cnf o xampp/mysql/my.cnf)

[mysqld] 
character-set-server=utf8 
collation-server=utf8_general_ci 
1

I incontrato gli stessi problemi. Con la ricerca del codice, trovo il codice in vendor/doctrine/DBAL/lib/doctrine/DBAL/piattaforme/MySqlPlatform.php

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

Così ho cambiato in 'utf8_general_ci', e ha funzionato. Tutti collazione tavoli cambiato in utf8_general_ci dopo la ricostruzione, ma ho ancora una domanda: quando ho cambiato le annotazioni, ho ottenuto il seguente messaggio di errore:

[Creazione Errore] L'annotazione @ORM \ Tabella dichiarato in classe Gvsun \ UserBundle \ Entity \ User non ha una proprietà denominata "collation".Proprietà disponibili: nome, lo schema, indici, uniqueConstraints, opzioni

che cerco la documentazione della dottrina, ma non ho trovato la proprietà 'opzione', qualcuno può dirmi come utilizzare la proprietà opzioni, penso che potrebbe essere in grado di modificare le regole nelle impostazioni delle annotazioni?

+0

Da notare in "vendor \ doctrine \ dbal \ UPGRADE": '# Aggiornamento a 2.3 ## Creare tabelle MySQL ora è impostato su UTF-8 Se si sta creando una nuova tabella MySQL tramite l'API Doctrine, il set di caratteri/fascicolazione è ora impostato su 'utf8'/'utf8_unicode_ci' per impostazione predefinita. Precedentemente sono state utilizzate le impostazioni predefinite del server MySQL. – Leto

19

Il comportamento di fascicolazione è cambiato nella dottrina: http://www.doctrine-project.org/jira/browse/DDC-2139

La raccolta è ora impostato per utf8_unicode_ci se non si specifica nulla a livello di tabella. La strada da percorrere in questo momento è quello di aggiungerlo alle opzioni nella vostra dichiarazione di tabella:

/** 
* @ORM\Table(options={"collate"="utf8_swedish_ci"}) 
* @ORM\Entity 
*/ 

Questo genererà le regole di confronto corretto per la tabella:

$ php app/console doctrine:schema:update --dump-sql --env=test | grep swedish 
... DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci ENGINE = InnoDB; 

ho depositato un problema per la documentazione essere aggiornato per riflettere questo comportamento.

+2

Come nota: questa sintassi funziona solo sulla creazione iniziale della tabella. Se è necessario modificare le regole di confronto per la tabella esistente, è necessario prima eliminarlo. Controlla come funziona [effettivamente funziona] (https://github.com/doctrine/dbal/blob/6fb7312d208c9d6f45015953f367e5c33b2bdd5a/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php#L475-L478) – mente

+0

La fascicolazione della mente viene utilizzata solo dal database. Non è vero? Se è così, non è necessario lasciare cadere tutto il tavolo. Modificare la tabella dovrebbe essere sufficiente. C'è qualche problema con Doctrine? –

10

vi consiglio di provare aggiungere questa impostazione alla configurazione Dottrina:

options: 
     1002: "SET NAMES 'UTF8' COLLATE 'utf8_unicode_ci'" 

Così assomiglia a:

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

come configurazione dottrina di riferimento: http://symfony.com/doc/2.0/reference/configuration/doctrine.html#reference-dbal-configuration

E nel caso in cui si sta utilizzando MySql: http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

BTW. Ho avuto problemi con la visualizzazione di caratteri polacchi e l'aggiunta di nomi di set senza regole di confronto (come di seguito) aiutati.

+0

Grazie! Questo mi ha aiutato per i miei personaggi polacchi :) – unbreak

+0

Lo stesso qui;). Grazie Signore. –

0

Ho utilizzato con successo options: collate nella configurazione YML di Symfony 2.7.

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

se siete alla ricerca di un modo per avere migrazioni vengano create correttamente si dovrebbe impostare la connessione

è possibile impostare l'opzione di connessione default_table_options per raggiungere questo obiettivo: in symfony Questo viene fatto attraverso:

per coloro che cercano di farlo in semplice dottrina questo si traduce in opzione di connessione dottrina defaultDatabaseOptions, e viene passato al gestore di entità insieme con le credenziali del database, ecc:

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

UPDATE:

See Symfony3.1 libro per riferimento (click here):

Si noti inoltre l'utilizzo di utf8mb4 invece del semplice utf8. ("Symfony raccomanda utf8mb4 contro il set di caratteri utf8 di MySQL, in quanto non supporta i caratteri Unicode a 4 byte, e le stringhe che li contengono verrà troncato. Questo è fissata dal più recente utf8mb4 character set.")

impostazione di default UTF8 per MySQL è semplice come l'aggiunta di poche righe per file di configurazione (tipicamente 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 

è inoltre possibile modificare le impostazioni predefinite di Dottrina modo che il generato SQL utilizza la corretta c set di caratteri.

# app/config/config.yml 
doctrine: 
    dbal: 
     charset: utf8mb4 
     default_table_options: 
      charset: utf8mb4 
      collate: utf8mb4_unicode_ci 
0

ho questo problema con il recupero dei dati, che include i caratteri polacchi dal database. Sembra che:

effects of displaying data from db

mia config.yml è come:

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

e sono stato alla ricerca di una risposta per un paio d'ore - Im così stanco di questo. "1002: SET NAMES 'utf8'" Non funziona per me. Ma quando ho provato a accedere al mio db dal semplice script php (fuori symfony) l'effetto era lo stesso, ma quando ho aggiunto la linea:

mysql_query("SET NAMES 'utf8'"); 

ha funzionato correttamente. Quindi sembra essere poco strano. Tutte le tabelle nel mio db hanno impostato 'utf8_unicode_ci'.