2012-02-16 4 views
0

Я использую сервер Microsoft SQL Server как базу данных и свой php-код на сервере centos. используя freetds и dblib для подключения от yii framework к mssql.pdo dblib хранимая процедура вставляет неправильные символы

все в порядке. после вставки в db по хранимой процедуре, данные сохранены, но в запросе базы данных у нас есть ??????? в этой колонке NVARCHAR.

мои данные в utf-8 arabic. это моя конфигурация и код:

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

Поздний ответ. Попробуйте указать кодировку в конфигурации 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

+0

спасибо, но им не используя SQLServer и FreeTDS –

+0

tds version = 7.0 должно быть достаточно. Многие пакеты предварительно сконфигурированы с версией tds = 4.2, особенно con CentOS 6 и Ubuntu 14 LTS –

0

драйвер (FreeTDS) не поддерживает UTF-8 для MSSQL. Единственным драйвером, который поддерживает UTF-8 для MSSQL, является SQLDRV драйвер, доступный только для платформы Windows.

Для хранения данных в UTF-8 с использованием любого другого, кроме SQLDRV-драйвера (в настоящее время 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); 
Смежные вопросы