Doctrine2: jak ustawić wszystkie tabele do zestawiania z UTF8

Używam Doctrine z Symfony2. Mój config.plik yml wygląda mniej więcej tak: -

Konfiguracja Doktryny

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

Niestety moje tabele nie są zestawiane do UTF8_general_ci lub UTF8_unicode_ci Próbowałem

collate: utf8_unicode_ci

Ale Doctrine2 nie uznał tej opcji.

Jak mogę osiągnąć to samo?

Author: Amit, 2012-01-25

12 answers

Opcja charset: UTF8 jest po prostu przydatna, aby poprosić Doctrine o wykonanie SET NAMES UTF-8 na każdej stronie. Nie mam żadnej konkretnej konfiguracji dla Doctrine, a moje tabele są domyślnie w utf8_general_ci InnoDB. Przeczytaj tę część dokumentacji: http://www.doctrine-project.org/docs/orm/2.1/en/reference/faq.html#how-do-i-set-the-charset-and-collation-for-mysql-tables, odpowiada na twoje pytanie:

Nie można ustawić tych wartości wewnątrz adnotacji, mapowania yml lub xml pliki. Aby baza danych działa z domyślnym zestawem znaków i kolacją należy skonfigurować MySQL, aby używał go jako domyślnego zestawu znaków, lub utworzyć baza danych ze szczegółami charset i collation. W ten sposób dostają dziedziczone do wszystkich nowo utworzonych tabel i kolumn bazy danych.

 17
Author: Nanocom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 04:56:28

Zachowanie colate zmieniło się w doktrynie: http://www.doctrine-project.org/jira/browse/DDC-2139

Sortowanie jest teraz ustawione na utf8_unicode_ci, jeśli nic nie podasz na poziomie tabeli. Teraz należy dodać go do opcji w deklaracji tabeli:

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

Wygeneruje to poprawne Zestawienie dla tabeli:

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

Zgłosiłem problem, aby dokumentacja została zaktualizowana, aby odzwierciedlić to zachowanie.

 22
Author: rickard2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 09:35:00

Proponuję spróbować dodać to ustawienie do konfiguracji doktryny:

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

Wygląda więc tak:

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

Jako Konfiguracja doktryny odniesienia: http://symfony.com/doc/2.0/reference/configuration/doctrine.html#reference-dbal-configuration

I w przypadku, gdy używasz MySql: http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

BTW. Miałem problemy z wyświetlaniem polskich znaków i dodawaniem tylko nazw zestawów bez pomogło zestawienie (jak poniżej).

    options:
        1002: "SET NAMES 'UTF8'
 10
Author: v0rin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-12 14:15:01

UPDATE:

Zobacz Symfony3.1 book w celach informacyjnych ( Kliknij tutaj):

Zwróć również uwagę na użycie utf8mb4 zamiast zwykłego utf8. ("Symfony zaleca utf8mb4 przeciwko zestawowi znaków UTF8 MySQL, ponieważ nie obsługuje 4-bajtowych znaków unicode, a łańcuchy zawierające je zostaną obcięte. Jest to poprawione przez nowszy zestaw znaków utf8mb4.")

Ustawienie domyślnych UTF8 dla MySQL jest tak proste, jak dodanie kilku linii do Twój plik konfiguracyjny (typowo mój."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

Możesz również zmienić domyślne wartości dla Doctrine, aby wygenerowane SQL używa poprawnego zestawu znaków.

# app/config/config.yml
doctrine:
    dbal:
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci
 9
Author: DevWL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-05 02:03:34

Użyj poniższego kodu, aby ustawić collation, engine i charset (przykład adnotacji):

/**
* @ORM\Table(
*     name="temporary", 
*     options={"collate":"utf8_general_ci", "charset":"utf8", "engine":"MyISAM"}
* )  
* @ORM\Entity
*/    

Źródło: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-column

 8
Author: Igor Vizma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-18 21:27:28

Możesz zapoznać się z dokumentacją tutaj http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html Jeśli używasz Orms jak doktryny.

W szczególności: Dodawanie/Edycja [mysqld] bloku w Twoim moim.cnf (zwykle znajduje się w / etc / my.cnf lub xampp / mysql / my.cnf )

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
 4
Author: Amit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-26 10:28:27

Spotkałem się z tymi samymi problemami. Szukając kodu, znajduję kod w vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms / MySqlPlatform.php

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

Więc zmieniłem go na 'utf8_general_ci' i zadziałało. Wszystkie zestawienia tabel zostały zmienione na utf8_general_ci po przebudowaniu, ale mam jeszcze jedno pytanie: po zmianie adnotacji otrzymałem następujący komunikat o błędzie:

[Błąd tworzenia] adnotacja @ ORM\Table zadeklarowana w klasie Gvsun \ UserBundle\Entity\User nie ma właściwości o nazwie "collation". Dostępne Właściwości: Nazwa, schemat, indeksy, uniqueConstraints, opcje

Przeszukuję dokumentację Doctrine, ale nie znalazłem właściwości 'option', czy ktoś może mi powiedzieć jak używać właściwości options, myślę, że może być w stanie zmienić collate w Ustawieniach adnotacji?

 1
Author: Marco Chen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 05:45:21

Tworzę ręcznie swoją bazę danych za pomocą UTF8 collate (np. z phpmyadmin). Jeśli to zrobię, wszystkie tabele utworzone poleceniem doctrine:schema: create będą miały UTF8.

 0
Author: smoreno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-26 05:02:08

Miałem ten sam problem i po przeczytaniu tej dokumentacji ze strony doctrine project postanowiłem porzucić rozwiązanie z plikiem yml.

 0
Author: Dawid Job,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-22 03:14:50

Z powodzeniem zastosowałem options: collate w konfiguracji YML Symfony 2.7.

MyBundle\Entity\Company:
    type: entity
    repositoryClass: MyBundle\Repository\CompanyRepository
    table: company
    options:
        collate: utf8_general_ci
 0
Author: Sithu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 04:01:46

Jeśli szukasz sposobu na poprawne tworzenie migracji, powinieneś skonfigurować połączenie

Możesz ustawić opcję połączenia default_table_options, aby to osiągnąć: w symfony odbywa się to poprzez:

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

Dla tych, którzy chcą to zrobić w zwykłej doktrynie, przekłada się to na opcję połączenia z doktryną defaultDatabaseOptions i jest przekazywane do menedżera jednostek wraz z poświadczeniami bazy danych itp:

[
    ...
    'driver' => ...
    'user' => ...
    ...
    'defaultDatabaseOptions' => [
         'charset' => 'utf8',
         'collate' => 'utf8_general_ci'
    ]
]
 0
Author: esserj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-02 09:47:28

Mam problem z pobieraniem danych zawierających polskie znaki z bazy danych. Wygląda tak:

Efekty wyświetlania danych z db

Mój config.yml jest jak:

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'"
Od kilku godzin szukam odpowiedzi - mam tego dość. "1002: SET NAMES 'utf8' " nie działa dla mnie. Ale kiedy próbowałem uzyskać dostęp do mojego db z prostego skryptu php (z symfony) efekt był taki sam, ale kiedy dodałem linię:
mysql_query("SET NAMES 'utf8'");

Zadziałało jak należy. Więc wydaje się to trochę dziwne. Wszystkie tabele w moim db mają ustawiony' utf8_unicode_ci'.

 0
Author: skuteq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-08 19:28:12