Článek v rubrikách:

»MSSQL
»Dibi

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!


Zdrojový kód ke stažení odbc.php.txt

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:

  1. SUBSTRING( master.dbo.fn_varbintohexstr( HashBytes( 'md5',
  2. Nazev_firmy+';'+
  3. Ulice+';'+
  4. PSC+';'+
  5. Mesto+';'+
  6. Stat+';'
  7. ) ), 3, 32) as hash

Zdroj: vygooglováno (rekonstrukce dotazu nemožná, nalezeno náhodou)

nebo takto:

  1. 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.