Článek v rubrikách:
Dibi driver pro ODBC, jak na UTF-8 pro MSSQL
Článek je čistě naprosto nezáživný a pojednává pouze o nemožnosti rozchodit UTF-8 v ODBC. Jak jsem se to rozhodl řešit v dibi? A co MD5 v MSSQL? Jak mi na tom to řešení spadlo!
Hledal jsem a hledal, ale rozchodit MSSQL přes ODBC a UTF-8 se mi prostě nepodařilo, nativní drivery MSSQL v php mají jakousi chybu v souboru ntwdblib.dll, která jak se zdá tak v aktuální verzi PHP 5.2.9 stále není odstraněna.
Dibi a ODBC mi tedy přišlo jako menší zlo a musel jsem si trochu driver upravit. Úprava tkví v tom, že při každém query se převede dotaz pomocí iconv a při každém fetch se stringy převedou zpět do původního kódování, tedy vstup a výstup z databáze máme ošetřený. Ukázka viz. příklad ke stažení.
Problém nastane ve chvíli, když databáze vrátí znaky, které neodpovídají vstupnímu kódování. Kdy to třeba nastane? Třeba když řešíte MD5 v MSSQL.
MD5 se pak řeší např. takto:
- SUBSTRING( master.dbo.fn_varbintohexstr( HashBytes( 'md5',
- Nazev_firmy+';'+
- Ulice+';'+
- PSC+';'+
- Mesto+';'+
- Stat+';'
- ) ), 3, 32) as hash
Zdroj: vygooglováno (rekonstrukce dotazu nemožná, nalezeno náhodou)
nebo takto:
- RIGHT(master.dbo.fn_varbintohexstr (HashBytes('MD5','testovací řetězec')) ,32)
Zdroj: diskuse www.webfaq.cz
Bohužel z nějakého důvodu je při 1000 záznamech tato funkce neuvěřitelně pomalá a tak se mi opět osvědčilo jen bin2hex v PHP. A to je ten problém! Potřebujeme, aby databáze vrátila i něco co neodpovídá předpokládanému kódování, proto jsem si přidal do dibi driveru funkce stopEncoding() a startEncoding().
Zatím to šlape, ale chtělo by to nějaké čistší řešení. Otázka na dgx. Více snad v této diskusi.
komentáře
RSS Komentáře


