2016-12-26 21 views
3

私の内部プロジェクトでSELECTクエリ中にutf8文字(šđčćž)に関する問題が発生しました。私はfreetds定義の問題をfreetds.confのcharsetとバージョンに関して修正した後、SELECTクエリを実行するときに正しい文字を受け取るようになりました。PDO + MsSQL + freetds = INSERTクエリの文字が間違っています

しかし!今私は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 

ベロー、私のcurレンタルフリーセットの設定:

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

データベースのcharset連合はクロアチア_CI_ASです。残念ながら、私はそれを古いデータベースと同じように変更することはできません。古いアプリケーションで動作するように設計されており、そのアプリケーションではWebプレゼンテーションを行っています。

+0

接続のDSN –

+0

でパスUTF8あなたが考える場合: $ PDO =新しい\ PDO( "DBLIB:ホスト= $ホスト:$ポート; DBNAME = $データベース;のcharset = UTF8"、 」 $ username "、 " $ password " ); 既に疲れていて助けにならない。 –

+0

@MarkoMilojevicあなたの問題を再現できません。それは私にとってはうまくいくかもしれません。おそらく '$ statement-> bindValue(2、utf8_encode( 'Beriša')、\ PDO :: PARAM_STR); – meda

答えて

1

私はしばらくして解決策を見つけました。私は各値を処理する必要があるので、完璧なものではありません(これはコードの小さな修正ですが、それでもまだ十分にはきれいではありません)。もし誰かがこれをもっと良くする別のアイデアを持っているなら、投稿してください。

$statement->bindValue(2, iconv('utf-8', 'Windows-1252', 'Beriša'), \PDO::PARAM_STR); 
関連する問題