2012-02-16 45 views
0

我使用微软sql server作为数据库和我的php代码在centos服务器上。使用freetds和dblib从yii框架连接到mssql。pdo dblib存储过程插入错误的字符

一切都很好。通过存储过程插入到数据库后,数据保存但在数据库查询我们有???????在这个NVARCHAR列中。

我的数据是utf-8阿拉伯语。这是我的配置和代码:

fretds.conf

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

警予主要配置

'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(); 

回答

1

逾期答复。尝试使用选项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将替换ASCII'?'在角色的 位置,并发出一条警告消息,指出某些角色可能不会转换为 。

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

+0

感谢,但林不使用SQLSERVER和freetds的 – 2012-10-12 22:27:21

+0

tds版本= 7.0应该足够了。许多软件包预先配置了tds版本= 4.2,尤其是CentOS 6和Ubuntu 14 LTS – 2016-09-07 10:07:49

0

你的驱动程序(freetds的)不支持UTF-8 MSSQL。本机支持MSSQL的UTF-8的唯一驱动程序是SQLDRV驱动程序仅适用于Windows平台。

要使用任何非SQLDRV驱动程序(SQLDRV目前不适用于Linux)以UTF-8存储数据,应用程序必须注意将源字符集转换为UTF-8,反之亦然。因此,在连接字符串中设置“charset = UTF8”不起作用。从MSSQL读取时

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

,并将其转换回:

在PHP中,你应该数据存储到MSSQL像这样前转换

$sql = "SELECT dataUTF8 FROM table;"; 
$data = iconv('utf-8', 'windows-1250', $dataUTF8);