UTF-8 в базе данных SQL Server 2008 + PHP - PullRequest
3 голосов
/ 31 августа 2011

Я хочу хранить данные с помощью PHP в базе данных MS SQL 2008.

У меня проблемы с такими буквами, как ä ö ü ß, они некорректно отображаются в базе данных и при отображении на веб-сайте.

Это работает, когда я utf8_encode данных на входе и utf8_decode на выходе данных с PHP.

Есть ли другой способ решить эту проблему?

Ответы [ 3 ]

5 голосов
/ 31 августа 2011

Я однажды решил эту проблему, проблема в том, что драйвер PHP mssql не работает (не может найти ссылку на bugs.php.net, но он есть) и завершается ошибкой, когда дело доходит до полей nchar и nvarchar и utf8. Вам нужно будет немного преобразовать данные и запросы:

SELECT some_nvarchar_field FROM some_table

Во-первых, вам нужно изменить вывод на двоичный - чтобы он не испортился:

SELECT CONVERT(varbinary(MAX), some_nvarchar_field) FROM some_table;

Затем в PHP вам нужно преобразовать его обратно в UTF-8, там вам понадобится iconv extension

iconv('UTF-16LE', 'UTF-8', $result['some_nvarchar_field']);

Это исправляет выбор данных из базы данных, однако, если вы действительно хотите поместить некоторые данные в базу данных или добавить предложение WHERE, вы все равно будете получать ошибки, поэтому исправление для WHERE, UPDATE, INSERT и т. Д. Путем преобразования строки в шестнадцатеричную форму:
Представьте, что у вас есть этот запрос:

INSERT INTO some_table (some_nvarchar_field) VALUES ('ŽČŘĚÝÁÖ');

Теперь нам нужно запустить PHP:

$value = 'ŽČŘĚÝÁÖ';
$value = iconv('UTF-8', 'UTF-16LE', $value); //convert into native encoding 
$value = bin2hex($value); //convert into hexadecimal
$query = 'INSERT INTO some_table (some_nvarchar_field)  VALUES(CONVERT(nvarchar(MAX), 0x'.$value.'))'; 

Запрос становится таким:

INSERT INTO some_table (some_nvarchar_field) VALUES (CONVERT(nvarchar(MAX), 0x7d010c0158011a01dd00c100d600));

И это будет работать !

Я проверил это на MS SQL Server 2008 в Linux, используя FreeTDS, и он отлично работает, у меня есть несколько огромных веб-сайтов, работающих без проблем.

0 голосов
/ 14 сентября 2018

я могу вставить по коду

    $value = $_POST['first_name'];
    $value = iconv("UTF-8","UCS-2LE",$value);
    $value2 = $_POST['last_name'];
    $value2 = iconv("UTF-8","UCS-2LE",$value2);  
    $query = "INSERT INTO tbl_sample(first_name, last_name) VALUES (CONVERT(VARBINARY(MAX), '".$value."') , CONVERT(VARBINARY(MAX), '".$value2."'))"; 

    odbc_exec($connect, $query);

, если я не могу искать

0 голосов
/ 24 августа 2012

Я два дня искал, как вставить данные UTF-8 (из веб-форм) в MSSQL 2008 через PHP. Я читаю везде, что вы не можете, вам нужно сначала конвертировать в UCS2 (как рекомендует решение Cypher). В среде Windows SQLSRV считается хорошим решением, которое я не смог попробовать, так как я работаю на Mac OSX.

Однако в руководстве FreeTDS (которое PHP mssql использует в OSX) сказано добавить букву «N» перед открывающей цитатой:

mssql_query("INSERT INTO table (nvarcharField) VALUES (N'űáúőűá球最大的采购批发平台')", +xon);

Согласно этому обсуждению, символ N указывает серверу конвертировать в Unicode. https://softwareengineering.stackexchange.com/questions/155859/why-do-we-need-to-put-n-before-strings-in-microsoft-sql-server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...