PHP FREETDS MS SQL и локаль специальных символов - PullRequest
1 голос
/ 01 апреля 2020

мой Raspberry3 подключен к Windows MS SQL серверу, у меня много проблем с обновлением и вставкой строк в MS SQL с использованием соединения ODB C (FreeTDS), потому что некоторые символы (итальянский) преобразованы. Например, эта строка «Труба 1 м Ø 30 см. Макс. Температура 90 ° C» сохраняется как «Труба 1 м 30 30 см. Макс. Температура 90 ° C». Я много читал в Интернете, пытался изменить default_charset в php .ini, установить «набор данных клиента» в freetds.conf, также пробовал функцию iconv (), но ничего не работает.

Это PHP пример кода.

<?php
setlocale(LC_ALL, 'it_IT');    $odbc=odbc_connect("DRIVER=FreeTDS;SERVER=MyServer\SQLEXPRESS;Database=MyDB;UID=myUser;$PWD=myPWD;TDS_Version= Auto;Port=1433;", "","") or die(odbc_errormsg());
$value = 'string with special chars: °±Øòàèé?°§ù end string';
$q="UPDATE MYTABLE set MYFIELD = '$value' WHERE ID = 1";
odbc_exec($odbc, $q) or die("<p>".odbc_errormsg());
odbc_close($odbc);
?>

результат: "строка со специальными символами: строка "

Как я могу это решить?

1 Ответ

0 голосов
/ 01 апреля 2020

Хотя использование параметров является правильным решением, причина этого заключается в том, что специальные символы переводятся в varchar, для которого нет кодовой точки.

В этом запросе содержимое $value будет преобразован в varchar по одному байту на символ в текущем сопоставлении.

$q="UPDATE MYTABLE set MYFIELD = '$value' WHERE ID = 1";

Юникод nvarchar строковый литерал с префиксом N. EG

$q="UPDATE MYTABLE set MYFIELD = N'$value' WHERE ID = 1";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...