хранимая процедура pdo dblib вставляет неправильные символы - PullRequest
0 голосов
/ 16 февраля 2012

Я использую 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();

Ответы [ 2 ]

1 голос
/ 12 октября 2012

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

Ваш драйвер (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);
...