我正在使用microsoft sql server作为数据库和我的php代码在centos服务器上。使用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();
答案 0 :(得分: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
答案 1 :(得分:0)
您的驱动程序(freeTDS)不支持MSDS的UTF-8。本机支持MSDS的UTF-8的唯一驱动程序是SQLDRV驱动程序,仅适用于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);