Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с UTF8 и MSSQL 
:(
    Опции темы
infarch
Дата 16.9.2019, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Здравствуйте.

Я работаю над сайтом, который использует Убунту и Апач в качестве вебсервера, и Microsoft SQL Server как базу данных. Коннектимся через freetds+unixODBC. Все работало нормально, но вот пришло время переезда и сейчас мы тестируем все это в Azure. Для этого детачнули базу тестового сервера и приатачили в азуре. Поставили последнюю версию freeetds / odbc, сделали чекаут сайта из репозитория. Тут и выплыл занятный баг.
Для начала, utf8 строка которая была в старой базе выглядит в SSMS правильно, но отображается как "????" в веб интерфейсе: https://www.screencast.com/t/86kYD7eO
Если создать новую строку через веб интерфейс, она выглядит нормально на сайте, но криво в базе: https://www.screencast.com/t/YkCU14OD
Запуская на убунте (в терминале) скрипт для вставки тестовой строки, в базе получаю хорошее значение: https://www.screencast.com/t/TBjOkYTC3
Почти идентичный код выполненный через Апач создает кривую строку в базе.
Я свои идеи практически исчерпал, прошу помощи коллективного разума! Что может быть не так???

пс: непосредственно перед отправкой подумал что скрипт в терминале и Апач работают от разных пользователей. Не знаю как это может влиять но это наверно единственное отличие. Как проверить такую догадку? Ну не силен я в убунтах, большей частью програмист.
PM MAIL   Вверх
arto
Дата 16.9.2019, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



посмотрите в http заголовке кодировку.
PM MAIL ICQ   Вверх
infarch
Дата 16.9.2019, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Посмотрел: https://www.screencast.com/t/oE53VuGjlG
Вместо знаков вопроса там должна быть кирилица. Я сомневаюсь что в заголовках дело. Вызывая скрипт из терминала я получаю нормальную запись в базе, он-же через апач - баг! Мне тут подсказали что может терминал и мод-перл используют разные версии перла. На первый взгляд они одинаковые, но может разница в билдах... 
https://www.screencast.com/t/0GgauypTt8sL
https://www.screencast.com/t/v1dg1Ilxg
PM MAIL   Вверх
arto
Дата 17.9.2019, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



Скорее всего из базы вы получаете данные не в utf-8 кодировке.
Какая у вас там локальная кодировка?
PM MAIL ICQ   Вверх
infarch
Дата 17.9.2019, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



"Там" - это где? В базе строки nvarchar. Сохранены они правильно, в utf8, что и видно в SSMS. Но вот читаются как-то плохо. И проблема не только с чтением. Я уже писал про вставку и мне кажется тут проще всего накопать корень зла. 

У меня есть перл скрипт для вставки кириличной строки в базу.
Когда я его выполняю из терминала командой 'perl uodbc.pl', он вставляет правильное значение. 
Запускал от имени www-data ("sudo -H -u www-data bash -c 'perl uodbc.pl'"): тоже правильный результат. 
Скопировал текст скрипта, вставил в файлы сайта и вызвал через Апач - вставка НЕПРАВИЛЬНАЯ. 
Закоментировал вставку на сайте, а вместо нее вызвал оригинальный скрипт: "system('perl /home/Docia/uodbc.pl')". Пинаю это через Апач - вставка НЕПРАВИЛЬНАЯ. 
Усложнил ситуацию: из терминала вызываю скрипт который запускает файл с сайта который выполняет вышеуказанный system. Вставка правильная!

Как тут ни крути, а результат вырисовавается один. Один и тот же перл скрипт вставляет в базу правильное значение когда вызван ручками через терминал, и неправильное - когда вызван апачем. В апаче я юзаю mod-perl. Перл в системе вроде бы только один. Пока нет идей как все это пофиксать :(

PM MAIL   Вверх
arto
Дата 17.9.2019, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



следите за кодировками.
с MSSQL не работал, только с Sybase, проблем не было.

Вы какой метод используете для работы с базой и какой драйвер?
PM MAIL ICQ   Вверх
infarch
Дата 18.9.2019, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Драйвер freeTDS + unixODBC

Все работало отлично, пока мы не начали переезжать в Азуру. Сейчас разворачиваем тестовый сайт на их виртуалках и все ставим с нуля. И по выплыла такая проблема.
PM MAIL   Вверх
arto
Дата 18.9.2019, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



DBD & DBI::ODBC ?

какая кодировка в базе (UTF-7 UTF-8 UTF-16 UTF-16BE UTF-16LE UTF-32 UTF-32BE UTF-32LE)?
PM MAIL ICQ   Вверх
infarch
Дата 18.9.2019, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Этот вопрос меня несколько смутил. Насколько я знаю, поля nchar/nvarchar/ntext хранят юникодные строки, а какой способ кодирования выбирает для этого база - хз... Я их просто читаю и пишу. Perl передает и принимает раскодированные строки.
Однако проблема решилась! Я изменил значение переменной LANG для апача в "/etc/apache2/envvars: export LANG=en_us.UTF-8
До этого значение переменной было С, и этого хватало для старого сервера. В новом что-то не срослось. Но теперь все отлично!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1175 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.