Autor Zpráva
Chuchycek
Profil
Ahoj,
mám problém s kodováním MsSQL databáze má kodování cp1250 a v php mi běží aplikace na nette + dibi s kodováním utf8. Nemám možnost změnit kodování na MsSQL serveru. Prosím tedy o radu.

Díky H.
Zechy
Profil
Já jsem to posledně řešil takhle.
Chuchycek
Profil
To se mi zrovna nezdá jako čisté řešení..
Zechy
Profil
Chuchycek:
Jak je ve vláknu psáno, existuje možnost posílat to s N' prefixem do nvarchar sloupce - tedy třeba
INSERT INTO some_table (some_nvarchar_column) VALUES(N'Some value')

Ale mě osobně z toho kolaboval celý webserver při dlouhých řetězcích na dibi, tudíž jsem to musel takhle obcházet.
Chuchycek
Profil
A něco globálnějšího pro již fungující aplikaci?
Zechy
Profil
Osobně i v práci máme pro databázové modely zavedené ERM a v základní třídě, ze které ostatní entity dědí, při získávání hodnot pro insert či update do dibi se pak dále řídíme dle anotací. Když kolegové v práci experimentovali s N' prefixy, řídili se tím, že proměnná má uvedeno @var string, já si ve svém aplikaci zase přidával vlastní anotaci @unicode, protože ne všechny řetězce jsem potřeboval takto převádět.

Takhle se pak zajistilo, že ať se ukládala jakákoli entita, tak při generování dotazu se automaticky provedlo pro Dibi to, co mělo. Ať už se doplnil N' prefix nebo se to prohnalo tím procesem z [#2].
tatyalien
Profil
Nahoď si jinou knihovnu na komunikaci místo mssql třeba php_pdo_sqlsrv, ta podporuje utf8 a nemusí se tak všechny data překonvertovávat pomocí iconv...
Zechy
Profil
tatyalien:
Dibi defaultně využívá php_pdo_sqlsrv. Ono to sice komunikuje v UTF-8, ale MSSQL utf-8 nezná, pro ní to prakticky neexistuje. Proto se používají nvarchary a N' prefixy, kdy se databázi řekne, že se jedná o unicode řetězec, a tudíž se pak uloží tak, jak má.

A ochcávačka s iconv... To je tím, že dibi při dlouhém řetězci může kolabovat.
tatyalien
Profil
Zechy:
Aha, já jsem na lokálu požíval právě knihovnu mssql a dibi s ní mělo problém, že nebrala v potaz charset na utf8, po nahození knihovny php_pdo_sqlsrv to začalo fachat. Ale nezkoušel jsem extra dlouhé řetězce.
Zechy
Profil
tatyalien:
Tak někdy to funguje naprosto bez problémů - řetězec se uloží jak má, třeba v práci nemusíme používat N', aby to nerozbilo kodování. Ale když jsem to dělal pro svůj vlastní projekt, tak i přes nastavení kodování na Czech jsem musel použít N' prefix a tu byl problém - Když do dibi přišel třeba řetězec o 700 znacích, tak při generování dotazu se něco zvrtlo a restartoval se celý apache. Je to popsaný v odkazu z [#2] :).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: