0

データベースとしてMicrosoft SQLサーバーを使用し、centosサーバーでphpコードを使用しています。freetds と dblib を使用して、yii フレームワークから mssql に接続します。

すべては大丈夫です。ストアド プロシージャによって db に挿入した後、データは保存されましたが、データベース クエリには ??????? があります。この NVARCHAR 列に。

私のデータはutf-8アラビア語です。これは私の構成とコードです:

fretds.conf

[mss]  
        host = 172.31.1.2  
        ip = 172.31.1.2  
        port = 1433  
        tds version = 7.0

yii の主な構成

'db'=>array(
        'connectionString' => 'dblib:host=mss;database=XXXX;charset=utf8',
        'username' => 'XXX',
        'password' => 'XXXXXXXX',
        'charset' => 'utf8',
        'tablePrefix' => 'tbl_',
        'enableProfiling' => true,
        'schemaCachingDuration' => 5 * 60 * 60,
        ),

私のモデルストアドプロシージャ

$builder=$this->getCommandBuilder();
$table=$this->getMetaData()->tableSchema;

$command=$builder->createSqlCommand('EXEC dbo.sp_link_comment_insert  :link_id, :cmnt_parent_id, :user_id, :cmnt_status, :cmnt_text, :cmnt_thread',
                    array(
                        ':link_id'=>58829,
                        ':cmnt_parent_id'=>'',
                        ':user_id'=>9,
                        ':cmnt_status'=>1,
                        ':cmnt_text'=>'تست ارسال comment',
                        ':cmnt_thread'=>0,
                    )
                );
$command->execute();
4

2 に答える 2

1

返信が遅くなりました。オプションを使用して、freetds 構成でエンコーディングを指定してみてくださいclient charset = UTF-8。変更後、構成ファイルは次のようになります。

[mss]  
    host = 172.31.1.2  
    ip = 172.31.1.2  
    port = 1433  
    tds version = 7.0
    client charset = UTF-8

ドキュメントによると、認識されない文字は に変換され?ます。

FreeTDS が変換できない文字に遭遇した場合、その動作は問題の深刻度によって異なります。サーバーからデータを取得する際、FreeTDS は ASCII '?' に置き換えます。文字の代わりに変換され、一部の文字が変換できなかったことを示す警告メッセージが表示されます。

参照: http://freetds.schemamania.org/userguide/localization.htm

于 2012-10-12T06:46:46.160 に答える
0

お使いのドライバー (freeTDS) は、MSSQL の UTF-8 をサポートしていません。MSSQL の UTF-8 をネイティブにサポートする唯一のドライバーは、Windows プラットフォームでのみ使用可能なSQLDRVドライバーです。

SQLDRV ドライバー以外を使用して UTF-8 でデータを保存するには (SQLDRV は現時点では Linux では使用できません)、アプリケーションはソース文字セットから UTF-8 への変換、およびその逆の変換を行う必要があります。したがって、接続文字列で「charset=UTF8」を設定しても効果はありません。

PHP では、次のように MSSQL に格納する前にデータを変換する必要があります。

$dataUTF8 = iconv('windows-1250', 'utf-8', $data);
$sql = "INSERT INTO table (value) VALUES ($dataUTF8)";

MSSQLから読み取るときにそれらを元に変換します。

$sql = "SELECT dataUTF8 FROM table;";
$data = iconv('utf-8', 'windows-1250', $dataUTF8);
于 2014-08-04T16:32:38.613 に答える