PDO + MsSQL + freetds = неправильные символы в запросах INSERT

Я заметил проблему во время запросов SELECT в моем внутреннем проекте, связанную с символами utf8 (šđčćž). После того, как я исправил проблему, связанную с определением freetds для набора символов и версии в freetds.conf, я начал получать правильные символы при выполнении запросов SELECT.

Но! Теперь у меня возникают проблемы с запросами INSERT/UPDATE и с запросом SELECT, когда я пытаюсь найти поля с некоторыми из этих символов (šđčćž), и это только с методом PDO bindValue.

Например, это мой код:

try {
$pdo = new \PDO(
      "dblib:host=$host:$port;dbname=$database",
      "$username",
      "$password"
   );
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
   echo "There was a problem connecting. " . $e->getMessage();
}

Когда я пытаюсь вставить значения со следующим кодом, вставленные значения в базе данных верны:

$query = "INSERT INTO dbo.TABLE (ID, NAME) VALUES (2, 'Beriša');";
$statement = $pdo->prepare($query);
$statement->execute();

//Result:
//2 Beriša

Но после использования метода bindValue (который я должен использовать, так как работаю с Symfony2) возникает проблема:

$query = "INSERT INTO dbo.TABLE (ID, NAME) VALUES (?, ?);";
$statement = $pdo->prepare($query);
$statement->bindValue(1, 2, \PDO::PARAM_INT);
$statement->bindValue(2, 'Beriša', \PDO::PARAM_STR);
$statement->execute();

//Result:
//2 Beriša

Ниже вы можете найти мою текущую конфигурацию freetds:

[global]
    tds version = 8.0
    text size = 20971520
    client charset = UTF-8

Коалиция кодировки базы данных — Croatian_CI_AS. К сожалению, я не могу это изменить, так как это старая база данных, предназначенная для работы со старым приложением, и для этого приложения я работаю над веб-презентацией.


person Marko Milojevic    schedule 26.12.2016    source источник
comment
передать utf8 в dsn соединения   -  person Funk Forty Niner    schedule 26.12.2016
comment
Если вы думаете о: $pdo = new \PDO( dblib:host=$host:$port;dbname=$database;charset=utf8, $username, $password); Уже устал и это не помогает.   -  person Marko Milojevic    schedule 26.12.2016
comment
@MarkoMilojevic Я не могу воспроизвести вашу проблему, у меня это работает, возможно, это поможет $statement->bindValue(2, utf8_encode('Beriša'), \PDO::PARAM_STR);   -  person meda    schedule 26.12.2016
comment
@meda Я пробовал, но безрезультатно. Тем не менее, подобное решение дало мне результат (см. ответ ниже). Возможно, вы сможете найти более чистое решение (рассмотрев ответ ниже как идею).   -  person Marko Milojevic    schedule 26.12.2016
comment
Какой тип данных вы использовали в SQL сервере   -  person meda    schedule 26.12.2016
comment
В данном случае варчар.   -  person Marko Milojevic    schedule 26.12.2016


Ответы (1)


Я нашел решение через некоторое время. Это не идеально, так как мне нужно обработать каждое значение (это небольшое исправление для кода, но все еще недостаточно чистое). Если у кого-то есть другая идея, чтобы сделать это лучше, опубликуйте его, пожалуйста.

$statement->bindValue(2, iconv('utf-8', 'Windows-1252', 'Beriša'), \PDO::PARAM_STR);
person Marko Milojevic    schedule 26.12.2016