На машине с Linux я использую PDO DBLIB для подключения к базе данных MSSQL и вставки данных в таблицу SQL_Latin1_General_CP1_CI_AS
. Проблема в том, что когда я пытаюсь вставить китайские символы (многобайтовые), они вставляются как 哈市香åŠåŒºç 江路å·
.
Мой (часть) код выглядит следующим образом:
$DBH = new PDO("dblib:host=$myServer;dbname=$myDB;", $myUser, $myPass);
$query = "
INSERT INTO UserSignUpInfo
(FirstName)
VALUES
(:firstname)";
$STH = $DBH->prepare($query);
$STH->bindParam(':firstname', $firstname);
Что я пробовал до сих пор:
Выполнение
mb_convert_encoding
доUTF-16LE
на$firstname
и CAST как VARBINARY в запросе, например:$firstname = mb_convert_encoding($firstname, 'UTF-16LE', 'UTF-8');
VALUES (CAST(:firstname AS VARBINARY));
Это приводит к правильной вставке символов, пока не появятся некоторые не многобайтовые символы, которые прерывают выполнение PDO.
Установка моего соединения как utf8:
$DBH = new PDO("dblib:host=$myServer;dbname=$myDB;charset=UTF-8;", $myUser, $myPass); $DBH->exec('SET CHARACTER SET utf8'); $DBH->query("SET NAMES utf8");
Установка
client charset
в UTF-8 в моем файле freetds.confЧто никак не повлияло.
Есть ли вообще способ вставить многобайтовые данные в эту базу данных SQL? Есть ли другой обходной путь? Я думал попробовать PDO ODBC или даже mssql, но подумал, что лучше спросить здесь, прежде чем тратить время.
Заранее спасибо.
ИЗМЕНИТЬ:
В итоге я использовал MSSQL и префикс типа данных N
. Я заменю и попробую PDO_ODBC, когда у меня будет больше времени. Спасибо всем за ответы!
nvarchar()
илиntext
? - person shA.t   schedule 10.03.2015$STH->bindValue(':value', iconv('UTF-8', 'ISO8859-1', $value));
. Это похоже на первый пункт вашего вопроса в разделе Что я пробовал до сих пор. Я не понимаю, в какой тип столбца вы вставляете, так что это может не сработать. - person chue x   schedule 16.04.2015