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?
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.
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.
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'
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
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
*/
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
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?
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.
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.
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
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'
]
]
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'.
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