Sql server 2008 pdo dblib存储过程插入错误字符

Sql server 2008 pdo dblib存储过程插入错误字符,sql-server-2008,pdo,yii,freetds,Sql Server 2008,Pdo,Yii,Freetds,我在centos服务器上使用microsoft sql server作为数据库和php代码。使用freetds和dblib从yii框架连接到mssql 一切都很好。通过存储过程插入数据库后,数据已保存,但在数据库查询中我们有???????在这个NVARCHAR列中 我的数据是utf-8阿拉伯语。这是我的配置和代码: fretds.conf [mss] host = 172.31.1.2 ip = 172.31.1.2 port = 14

我在centos服务器上使用microsoft sql server作为数据库和php代码。使用freetds和dblib从yii框架连接到mssql

一切都很好。通过存储过程插入数据库后,数据已保存,但在数据库查询中我们有???????在这个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();

迟来的答复。尝试使用选项
client charset=UTF-8
在freetds配置中指定编码。更改后,您的配置文件将如下所示:

[mss]  
    host = 172.31.1.2  
    ip = 172.31.1.2  
    port = 1433  
    tds version = 7.0
    client charset = UTF-8
根据文档,未识别的字符将转换为

如果FreeTDS遇到无法转换的字符,则其行为 根据问题的严重程度而有所不同。关于检索数据 从服务器上,FreeTDS在字符的 放置,并发出警告消息,指出某些字符可能 不能转换

参考资料:

您的驱动程序(freeTDS)不支持MSSQL的UTF-8。本机支持MSSQL的UTF-8的唯一驱动程序是仅适用于windows平台的驱动程序

要使用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);

tds版本=7.0就足够了。许多软件包都预先配置了tds版本=4.2,尤其是Concentos 6和Ubuntu14 LTS