Autor Zpráva
Zechy
Profil
Zdravím,

řeším na webu, co jede na mssql serveru, problém s ukládáním diakritiky. Potřebuji do nvarchar sloupců uložit string s diakritikou, pro což musím prefix N. Mám ovšem problém, že když dibi dostane do dotazu N'nějáký řetězec' s dlouhým řetězcem, vkládal jsem třeba řetězec o 700 znacích, tak při generování SQL dotazu to celé nějak zkolabuje a restartuje se Apache. Zkoušel jsem se dívat do apache logu i php logu, jestli alespoň o tom něco nenajdu, ale kde nic, tu nic.

Neřešil už někdo podobný problém?
Zechy
Profil
Tak někomu se určitě jednou řešení bude hodit, dokázal jsem se dostat k tomu, jak to obejít i bez použití N' prefixu.

V PHP se nejdřív hodnota prožene přes iconv a převede do UTF-16LE, vzniklá hodnota se pak ještě prožené funkcí bin2hex.
$hodnota = 'ŽČŘĚÝÁÖ';
$hodnota = iconv("UTF-8", "UTF-16LE", $hodnota);
$hodnota = bin2hex($hodnota);

Do SQL dotazu se pak před vzniklou hodnotu přidá ještě 0x a dá se do funkce CONVERT, kdy se bude převádět do nvarcharu. Vzniklý dotaz tedy bude vypadat následovně:
INSERT INTO some_table (some_nvarchar_field) VALUES (CONVERT(nvarchar(MAX), 0x7d010c0158011a01dd00c100d600));

Oproti tomu, jak snadno se dá použít N' prefix je to sice trošku zdlouhavější, ale když Dibi začne generovat dotaz, tak už se mi nestane, že by Apache došel do chyby a restartoval se, proběhne se to bez problému a okamžitě.

Pozn.: Při čtení z databáze se prý má daná hodnota ještě překonvertovat zpátky z 16LE do 8 (jestli jsem pochopil dobře, co tam v úvodu píše), ale z databáze se vše vrací tak, jak se to mělo uložit bez potřeby něco dělat. Původní vlákno na StackOverflow.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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