Thread View: pl.comp.lang.php
8 messages
8 total messages
Started by Hoozar
Tue, 09 Sep 2014 11:20
ZF2 + Doctrine + collation = porazka
Author: Hoozar
Date: Tue, 09 Sep 2014 11:20
Date: Tue, 09 Sep 2014 11:20
115 lines
4051 bytes
4051 bytes
Witam!
Sprawa ma się tak:
Doctrine skonfigurowany tak:
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => array(
'host' => '127.0.0.1',
'port' => 3306,
'user' => '***',
'password' => '***',
'dbname' => '***',
'charset' => 'UTF8',
),
),
),
),
tabele robione z annotation poleceniem vendor/bin/doctrine-module
orm:schema-tool:update
Tabela wygląda tak:
/**
* @ORM\Entity
* @ORM\Table( name="tabela1", options={"collate"="utf8_general_ci",
"charset"="utf8"})
*/
class PierwszaTabela
{
/**
* @ORM\Id
* @ORM\Column(type="string", nullable=false, length=31,
options={"collate"="utf_general_ci", "charset"="utf8"})
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="fq\cn\PierwszaTabela")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id",
nullable=true)
*/
protected $parent;
/**
* @ORM\Column(type="text", nullable=false)
*/
protected $nazwa = '';
ciach(...);
Jest druga tabela i relacja many-to-many:
/**
* @ORM\Entity
* @ORM\Table( name="tabela2", options={"collate"="utf8_general_ci",
"charset"="utf8"})
*/
class DrugaTabela
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
ciach(...)
/**
* @ORM\ManyToMany(targetEntity="fq\cn\PierwszaTabela")
* @ORM\JoinTable(name="tabela_join",
* joinColumns={@ORM\JoinColumn(name="drugatabela_id",
referencedColumnName="id")},
*
inverseJoinColumns={@ORM\JoinColumn(name="pierwszatabela_id",
referencedColumnName="id")}
* )
* @var ArrayCollection
*/
protected $dane_z_pierwszej_tabeli;
ciach(...)
jest też PROBLEM, polegający na tym, że doctrine ma w nosie collation i
przy tworzeniu tabela_join używa utf8_unicode_ci:
CREATE TABLE tabela_join (drugatabela_id INT NOT NULL, pierwszatabela_id
VARCHAR(31) NOT NULL, INDEX IDX_7987DA4E853CD175 (drugatabela_id), INDEX
IDX_7987DA4E578D5E91 (pierwszatabela_id), PRIMARY KEY(drugatabela_id,
pierwszatabela_id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci
ENGINE = InnoDB;
a potem jeszcze:
ALTER TABLE tabela_join ADD CONSTRAINT FK_7987DA4E853CD175 FOREIGN KEY
(drugatabela_id) REFERENCES tabela2 (id); - to przejdzie
ALTER TABLE tabela_join ADD CONSTRAINT FK_7987DA4E578D5E91 FOREIGN KEY
(pierwszatabela_id) REFERENCES tabela1 (id); - a to oczywiście wywali
błąd, bo ma rozne collation.
W dokumentacji do Doctrine stoi niestety ze:
## Creating MySQL Tables now defaults to UTF-8
If you are creating a new MySQL Table through the Doctrine API,
charset/collate are
now set to 'utf8'/'utf8_unicode_ci' by default. Previously the MySQL
server defaults were used.
Czy jest znany jakiś sposób na eleganckie obejście tego, czy zostaje
tylko poprawienie źródeł Doctrine?
Pozdrawiam
Huzar
Re: ZF2 + Doctrine + collation = porazka
Author: Hoozar
Date: Tue, 09 Sep 2014 11:21
Date: Tue, 09 Sep 2014 11:21
3 lines
966 bytes
966 bytes
W dniu 09.09.2014 o 13:20, Hoozar pisze: > Witam! przepraszam za drugiego posta, net padl i czytnik napisal ze nie poszlo
Re: ZF2 + Doctrine + collation = porazka
Author: platformowe głupki
Date: Tue, 09 Sep 2014 11:53
Date: Tue, 09 Sep 2014 11:53
1 lines
965 bytes
965 bytes
spoko i tak nie wiemy
Re: ZF2 + Doctrine + collation = porazka
Author: Hoozar
Date: Tue, 09 Sep 2014 12:16
Date: Tue, 09 Sep 2014 12:16
3 lines
1050 bytes
1050 bytes
W dniu 09.09.2014 o 13:53, platformowe głupki pisze: > spoko i tak nie wiemy heh, czuje przemozna potrzebe zgloszenia tego jako bug.
Re: ZF2 + Doctrine + collation = porazka
Author: Borys Pogoreło
Date: Tue, 09 Sep 2014 16:02
Date: Tue, 09 Sep 2014 16:02
11 lines
1270 bytes
1270 bytes
Dnia Tue, 09 Sep 2014 14:16:44 +0200, Hoozar napisał(a): >> spoko i tak nie wiemy > heh, czuje przemozna potrzebe zgloszenia tego jako bug. To jest udokumentowane zachowanie: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/faq.html#how-do-i-set-the-charset-and-collation-for-mysql-tables -- Borys Pogoreło borys(#)leszno,edu,pl
Re: ZF2 + Doctrine + collation = porazka
Author: Hoozar
Date: Wed, 10 Sep 2014 06:22
Date: Wed, 10 Sep 2014 06:22
15 lines
1789 bytes
1789 bytes
W dniu 09.09.2014 o 18:02, Borys Pogoreło pisze: > Dnia Tue, 09 Sep 2014 14:16:44 +0200, Hoozar napisał(a): > >>> spoko i tak nie wiemy >> heh, czuje przemozna potrzebe zgloszenia tego jako bug. > > To jest udokumentowane zachowanie: > http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/faq.html#how-do-i-set-the-charset-and-collation-for-mysql-tables > I tak i nie. Tak - bo trzeba odpowiednio skonfigurować bazę, żeby uzyskać odpowiednie collation. Nie - bo w źródłach Doctrine jest wpisane na sztywno 'utf8_unicode_ci'. Nie da się tego zmienić np. opcjami tabeli, bo JoinTable nie ma takiego parametru. Jeśli teraz będę chciał mieć bazę w innym collation czy w innym kodowaniu to i tak się wszystko wywali :-(
Re: ZF2 + Doctrine + collation = porazka
Author: Borys Pogoreło
Date: Wed, 10 Sep 2014 18:16
Date: Wed, 10 Sep 2014 18:16
24 lines
1971 bytes
1971 bytes
Dnia Wed, 10 Sep 2014 08:22:58 +0200, Hoozar napisał(a): >> To jest udokumentowane zachowanie: >> http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/faq.html#how-do-i-set-the-charset-and-collation-for-mysql-tables >> > I tak i nie. Tak - bo trzeba odpowiednio skonfigurować bazę, żeby > uzyskać odpowiednie collation. Ale to i tak należy zrobić, bo mogą się dziać cuda na różnych hostingach (zwłaszcza szwedzkie iso). > Nie - bo w źródłach Doctrine jest wpisane > na sztywno 'utf8_unicode_ci'. Nie da się tego zmienić np. opcjami > tabeli, bo JoinTable nie ma takiego parametru. Jeśli teraz będę chciał > mieć bazę w innym collation czy w innym kodowaniu to i tak się wszystko > wywali :-( W sensie Doctrine i tak ustawi utf8_unicode_ci zamiast dziedziczyć z ustawień bazy, pomimo zapewnień w FAQ? Jeśli tak, to faktycznie bym zgłosił buga. -- Borys Pogoreło borys(#)leszno,edu,pl
Re: ZF2 + Doctrine + collation = porazka
Author: Hoozar
Date: Thu, 11 Sep 2014 09:12
Date: Thu, 11 Sep 2014 09:12
46 lines
3159 bytes
3159 bytes
W dniu 10.09.2014 o 20:16, Borys Pogoreło pisze: > Dnia Wed, 10 Sep 2014 08:22:58 +0200, Hoozar napisał(a): > >>> To jest udokumentowane zachowanie: >>> http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/faq.html#how-do-i-set-the-charset-and-collation-for-mysql-tables >>> >> I tak i nie. Tak - bo trzeba odpowiednio skonfigurować bazę, żeby >> uzyskać odpowiednie collation. > > Ale to i tak należy zrobić, bo mogą się dziać cuda na różnych hostingach > (zwłaszcza szwedzkie iso). > To oczywiście zrobiłem. >> Nie - bo w źródłach Doctrine jest wpisane >> na sztywno 'utf8_unicode_ci'. Nie da się tego zmienić np. opcjami >> tabeli, bo JoinTable nie ma takiego parametru. Jeśli teraz będę chciał >> mieć bazę w innym collation czy w innym kodowaniu to i tak się wszystko >> wywali :-( > > W sensie Doctrine i tak ustawi utf8_unicode_ci zamiast dziedziczyć z > ustawień bazy, pomimo zapewnień w FAQ? Jeśli tak, to faktycznie bym zgłosił > buga. > Dokładnie tak zrobi. To działa w ten sposób: - jeśli tabela ma ustawione w opcjach (np. adnotacjami) 'collate', to Doctrine weźmie przy tworzeniu tabeli 'collate' z opcji. - jeśli nie ma, to weźmie na sztywno 'utf8_unicode_ci' Teraz cały problem polega na tym, że przy tworzeniu joinTable nie da się podać 'collate' jako opcji tabeli - będzie rzucał błędami, że nierozpoznany parametr. Tak więc weźmie opcję defaultową, czyli 'utf8_unicode_ci'. Najgorsze jest to, że do wersji 2.2 brał z ustawień bazy. Od 2.3 ma na sztywno - nie rozumiem takiego podejścia. Teraz żeby nie być gołosłownym: https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php - linia 476 https://github.com/doctrine/dbal/blob/master/UPGRADE.md - na samym dole w sekcji 'Upgrade to 2.3': If you are creating a new MySQL Table through the Doctrine API, charset/collate are now set to 'utf8'/'utf8_unicode_ci' by default. Previously the MySQL server defaults were used.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads