Кодировка в БД MS SQL

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
xCEZAREx
Сообщения: 34
Зарегистрирован: 2016.01.13, 20:26

Кодировка в БД MS SQL

Сообщение xCEZAREx »

Добрый день всем! Помогите пожалуйста.

Работаю с БД MS SQL через PDO_DBLIB, выборка работает нормально, но есть проблемы с кодировкой.
В самой БД установлена SQL_latin1_General_CP1_CI_AS, но при выборке через ActiveRecord у поля с кириллицей приводятся к виду ??????.

Конфиг подключения:

Код: Выделить всё

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'dblib:host=localhost:1433;dbname=myDatabase',
    'username' => 'myDatabase',
    'password' => 'myDatabase',
    'charset' => 'SQL_latin1_General_CP1_CI_AS', //замена на utf-8 не решает проблему
];
 
Собственно проблему можно решить используя CAST(FirstName AS VARBINARY(MAX)) as FirstName в createCommand, а потом пропустить весь массив полей результата через iconv('UCS-2LE', 'UTF-8', $value). Но это неудобно при выборке малого количества данных в ActiveRecord.

Для ActiveRecord пробовал писать поведение, но самое раннее событие это EVENT_AFTER_FIND, которое уже получает ??????.

Может кто подскажет вариант, как выставить нормальную кодировку?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Кодировка в БД MS SQL

Сообщение zelenin »

xCEZAREx писал(а):В самой БД установлена SQL_latin1_General_CP1_CI_AS
ну и почему бы утф не использовать?
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Кодировка в БД MS SQL

Сообщение chungachguk »

zelenin писал(а):
xCEZAREx писал(а):В самой БД установлена SQL_latin1_General_CP1_CI_AS
ну и почему бы утф не использовать?
По крайней мере у 2008 сервера нет UTF кодировки.
Может кто подскажет вариант, как выставить нормальную кодировку?
Если под виндой работаешь, то лучше поставить sqlsrv библиотеки, там проблем с кодировкой не замечено. А если под линуксом, то у меня тоже не получилось получить нужные данные, с использованием freetds. Так что если найдёшь решение, размести тут.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Кодировка в БД MS SQL

Сообщение zelenin »

chungachguk писал(а):По крайней мере у 2008 сервера нет UTF кодировки.
думаю, египетские фараоны тоже не знали об утф
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Кодировка в БД MS SQL

Сообщение chungachguk »

zelenin писал(а):
chungachguk писал(а):По крайней мере у 2008 сервера нет UTF кодировки.
думаю, египетские фараоны тоже не знали об утф
с фараонами понятно, а как с этим обстояли дела у шумер?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Кодировка в БД MS SQL

Сообщение zelenin »

chungachguk писал(а):
zelenin писал(а):
chungachguk писал(а):По крайней мере у 2008 сервера нет UTF кодировки.
думаю, египетские фараоны тоже не знали об утф
с фараонами понятно, а как с этим обстояли дела у шумер?
вы поняли о чем я. предлполагать, что у автора версия 8-летней давности, выпущенная 5 релизов назад, неконструктивно.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Кодировка в БД MS SQL

Сообщение chungachguk »

zelenin писал(а): вы поняли о чем я. предлполагать, что у автора версия 8-летней давности, выпущенная 5 релизов назад, неконструктивно.
Тут наши комменты похожи, предполагать, что у автора прошлогодняя версия, тоже не совсем верно. И сарказм про фараонов не уместен.
xCEZAREx
Сообщения: 34
Зарегистрирован: 2016.01.13, 20:26

Re: Кодировка в БД MS SQL

Сообщение xCEZAREx »

zelenin писал(а):
xCEZAREx писал(а):В самой БД установлена SQL_latin1_General_CP1_CI_AS
ну и почему бы утф не использовать?
Нецелесообразный вопрос. Если бы это было возможно - не стало необходимости создавать тему.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Кодировка в БД MS SQL

Сообщение zelenin »

xCEZAREx писал(а):
zelenin писал(а):
xCEZAREx писал(а):В самой БД установлена SQL_latin1_General_CP1_CI_AS
ну и почему бы утф не использовать?
Нецелесообразный вопрос. Если бы это было возможно - не стало необходимости создавать тему.
интересно, почему тогда тут создается 70% вопросов...
xCEZAREx
Сообщения: 34
Зарегистрирован: 2016.01.13, 20:26

Re: Кодировка в БД MS SQL

Сообщение xCEZAREx »

chungachguk писал(а): Если под виндой работаешь, то лучше поставить sqlsrv библиотеки, там проблем с кодировкой не замечено. А если под линуксом, то у меня тоже не получилось получить нужные данные, с использованием freetds. Так что если найдёшь решение, размести тут.
Спасибо за совет. Сервер веб-приложения под Линукс. MS SQL 2012, но база очень старая и обширная. С freetds ничего не получилось, но вроде есть расширение sqlsrv, попробую его использовать.
Restlin
Сообщения: 139
Зарегистрирован: 2011.09.09, 18:12

Re: Кодировка в БД MS SQL

Сообщение Restlin »

При работе с freetds нужно немного иначе писать строку подключения с кодировкой. По крайней мере у меня вот так работает с mssql 2000:

Код: Выделить всё

$db->dsn="dblib:host=server;dbname=db;charset=UTF-8";
И еще в файле freetds.conf описаны все сервера, с которыми можно осуществлять взадимодействие через freetds. Так вот в этом файле нужно указать версию сервера, чтобы работала перекодировка на лету версия должна быть >=8. Детали лучше брать из мана freetds.
xCEZAREx
Сообщения: 34
Зарегистрирован: 2016.01.13, 20:26

Re: Кодировка в БД MS SQL

Сообщение xCEZAREx »

Restlin писал(а):При работе с freetds нужно немного иначе писать строку подключения с кодировкой. По крайней мере у меня вот так работает с mssql 2000:

Код: Выделить всё

$db->dsn="dblib:host=server;dbname=db;charset=UTF-8";
И еще в файле freetds.conf описаны все сервера, с которыми можно осуществлять взадимодействие через freetds. Так вот в этом файле нужно указать версию сервера, чтобы работала перекодировка на лету версия должна быть >=8. Детали лучше брать из мана freetds.
Спасибо. Пробовал такую строку подключения, но не помогает.
На основном сервере такая же конфигурация как на локальном, но так же есть сконфигурированный freetds = 8.0 с прописанным подключением к серверам. Сегодня перепроверю конфиги, но скорее всего всеравно не поможет. Не могли бы вы привести свой пример?

p.s. еще находил вариант использования odbc, но его пока не пробовал.
Restlin
Сообщения: 139
Зарегистрирован: 2011.09.09, 18:12

Re: Кодировка в БД MS SQL

Сообщение Restlin »

Как я подключаюсь к базе в yii я уже привел. Это работает и в yii1 и в yii2.
freetds.conf содержит вот такие записи в 2х вариантах

Код: Выделить всё

[SERV]
    host = serv.firm.com
    port = 1433
    tds version = 8.0
[SERV_UTF8]
    host = serv.firm.com
    port = 1433
    tds version = 8.0
    client charset = UTF-8
Первый вариант работает с настройкой кодировки через DSN, второй сразу выдает результат в UTF-8 даже для подключений мимо PDO (у нас есть старые задачи, использующие mssql_connect и т.д.).
Единственно повторюсь, что мы используем очень старые mssql - 2000 и 2005, все новые наработки мы перенесли на PostgreSQL с MS.
Поэтому не знаю про поддержку со стороны freetds mssql 2012.
xCEZAREx
Сообщения: 34
Зарегистрирован: 2016.01.13, 20:26

Re: Кодировка в БД MS SQL

Сообщение xCEZAREx »

Restlin писал(а):Как я подключаюсь к базе в yii я уже привел. Это работает и в yii1 и в yii2.
freetds.conf содержит вот такие записи в 2х вариантах

Код: Выделить всё

[SERV]
    host = serv.firm.com
    port = 1433
    tds version = 8.0
[SERV_UTF8]
    host = serv.firm.com
    port = 1433
    tds version = 8.0
    client charset = UTF-8
Первый вариант работает с настройкой кодировки через DSN, второй сразу выдает результат в UTF-8 даже для подключений мимо PDO (у нас есть старые задачи, использующие mssql_connect и т.д.).
Единственно повторюсь, что мы используем очень старые mssql - 2000 и 2005, все новые наработки мы перенесли на PostgreSQL с MS.
Поэтому не знаю про поддержку со стороны freetds mssql 2012.
После Вашего поста понял, что freetds используется как прослойка между dblib и MS SQL Server, что явно не указано в мануалах. Прописал название конфигурации как имя хоста и все работает.
Ответить