pargentum: (Default)
[personal profile] pargentum
Про танкистов и фею
Танкисты одевают на танк порванную гусеницу (я сам не участвовал, но по рассказам survivors впечатление незабываемое).
Прилетает фея, спрашивает - ребята, а что вы делаете?
Ребята, естественно, отвечают - как что, не видишь - ебемся.
А - спрашивает фея - хотите поебаться по настоящему?
Конечно хотим - отвечают ребята.
Фея взмахивает волшебной палочкой и у танка отваливается башня.

Вот я седня именно в такой ситуации и оказался. Чудаки на букву М у заказчика поставили сервер с англицкой локалью по умолчанию. А наша аппликуха на MS SQL/ASP оказывается нормально функционирует только в русской локали. Для выяснения этого обстоятельства мне пришлось раз десять переставить сиквел и вставить около десятка отладочных печатей в разные места ASP скрипта, при том что я вообще впервые в жизни вижу, как ASP устроен внутре (как я и подозревал, вроде PHP, только с бэйсиковым синтаксисом. Бюээээээ....). После в общей сложности получаса телефонных консультаций с нашим гуру по сиквелу мы решили, что другого варианта кроме как переставлять сервак с нуля нету.
И мы сначала искали в чужой серверной дистрибутив винды 2000 сервера...
Самое смешное что это помогло.
Как я люблю юникс... export LOCALE=Ru_ru и ваши волосы становятся.... становятся...

Кто бы знал, как я заебался. В общем-то чудаки на букву М, если вдуматься, находятся по обе стороны баррикад. Плюс, я же узнал о том, что мне еще эту приблуду надо ставить будет за полчаса до отъезда, мне вручили два сидюка и на одном из них писульку на две страницы как ее устанавливать, которую я распечатал только непосредственно перед...

Date: 2002-06-29 11:00 am (UTC)
From: [identity profile] ex-ilyavinar899.livejournal.com
Синтаксис в ASP может быть какой угодно - например, пёрловский - если на сервере стоит интерпретатор требующегося языка, реализующий определенный интерфейс.

Date: 2002-06-29 11:27 am (UTC)
From: [identity profile] sergeax.livejournal.com
Мне всегда казалось, что открыть Control Panel, запустить Regional Settings и наставить там галочек в нужных локалях - это далеко не рокет сайнс. Но вот оказывается существуют люди, которым проще переустановить операционку ;)

Date: 2002-06-29 11:11 pm (UTC)
From: (Anonymous)
Не знаешь о чем речь - не суйся. На мудака меньше похож будешь.
From: [identity profile] pargentum.livejournal.com
Как этими сеттингами поменять локаль, в которой запускаются сервисы IIS?

Я пробовал - не получается. Нет, в реестре оно где-то прописано, факт. Только еще бы знать, где именно... и у меня почему-то есть предчувствие, что оно там прописано в нескольких разных местах и несколькими разными способами.

Что характерно, при установке апгрейдом оно даже не предлагает это сменить. Понадобилась чистая переустановка.
From: [identity profile] sergeax.livejournal.com
IIS всегда запускается из-под дефолтной системной локали. Сменить ее можно там же ;) Как сделать так, чтобы отдельные asp-страницы использовали собственную локаль при ображении к SQL2000 - я написал только что.

PS: только что попробовал - сменил дефолтную локаль backstage сервера, перезапустил - в IIS все стало по-японски. Правда, это была чистая инсталляция - возможно, что апгрейд унаследовал какое-то барахло в реестре от старой установки. К сожалению, последний "грязный" сервер был сдан в утиль еще год назад, так что проверить не могу.

Date: 2002-06-29 11:21 pm (UTC)
From: [identity profile] toshick.livejournal.com
Привет !

Помните, я говорил Вам о единственной проблеме, которая возникает с установкой 2000 ? Вот на нее Вы и напоролись. Позвонили бы - я бы сразу и сказал.

Подозреваю, что скрипты, создающие таблицы, у вас с определенным collation (так они создаются автоматически). Если collation сервера и, соответственно, tempdb другой, то любые операции с временными таблицами (создающимися в tempdb), в которых используется связь с основными таблицами по полю строчного типа, валятся от несоответствия collation.
В MSSQL2000 порядок сортировки определяется на трех уровнях: уровень сервера (т.е. db master), уровень базы данных и уровень каждого текстового поля в каждой таблице.

Лечится тремя способами:
1) сменить collation сервера. По идее, достаточно перегенерировать master специальной утилитой, но она не работает ;-). Реально надо переустанавливать;
2) вытереть из скриптов, создающих таблицы, явное указание collation. Но это надо думать и ручками двигать;
3) создавать временные таблицы с явным указанием collation.

Ленивее всего, конечно, воспользоваться первым способом.

From: [identity profile] pargentum.livejournal.com
Что коллэйшн в свойствах базы надо ставить я давно знаю. :)
Там, кстати, все было чуть хуже - база не скриптом создавалась, а поднималась как целое из бэкапа - а наши чудаки не написали, в какой collation оно должно быть. Я с трех попыток выбирал кэйз сенситиве и пр. параметры, а когда не помогло - переставил весь сервер с кириллической дефолт коллэйшн. Это тоже не помогло.
А проблема была в том, что интересовавший меня запрос исполнялся IIS'ом, ну, точнее, его интерпретатором ASP, который-то и работал не в той локали, какой надо. То есть вправлять мозги надо было не только и не столько SQL, сколько IIS. И вот ради последнего-то мне и пришлось переставлять винду.
From: [identity profile] sergeax.livejournal.com
Мне тут у вас уже один анонимус (надеюсь, это были не вы лично) написал гадость, но я человек настырный и привык делать добро ;) Чтобы ASP-страница работала вне зависимости от дефолтной локали сервера, в начале нее нужно написать:

<%@ LCID = 1049 %>

Note: локаль 1049 должна быть установлена на сервере в Regional Settings, но не обязательно быть дефолтной. Посл этого все преобразования строк, чисел, дат и времени, названия месяцев, дней недели и т.п., а также обращения к SQL2000 будут обрабатываться исходя из кириллической локали.

Установка кодовой страницы делается аналогично:

<%@ CODEPAGE = 1251 %>

Передайте вашим программерам, чтобы они включали эти две директивы в первую строку первого include (сразу перед Option Explicit) - и их волосы всегда будут шелковистыми.
From: [identity profile] pargentum.livejournal.com
Анонимус был не я. Если хотите, могу удалить, т.к. явный неспровоцированный наезд. Про шапку ASP при случае расскажу - это действительно ценные сведения. Мне самому, я надеюсь, это не пригодится.... хотя кто знает... Наши просто привыкли работать на буржуйский рынок, там-то англицкая локаль по умолчанию всех устраивает. Ломалось же у нас не собственно ASP и не собственно MS SQL, а ровнехонько на стыке: конструкция
		sql = "SELECT COUNT(*) FROM vw_users WHERE id=0"&curUser("ID")&" AND LOWER(user_type_name)='"&app_role&"'"
		set rs = adodb.GetRS(sql)
		if adodb.isRS(rs) then
			rs.movefirst
			HasAppRole = (CInt(rs(0)) = 1)
			rs.close
		end if
Во вьюшке значение user_type_name=Администратор, значение переменной app_role=администратор. Преобразование в нижний регистр, как видите, выполняется не ASP, а сиквелом, но в контексте ASP интерпретатора. Поэтому когда я сделал тестовую печать переменной sql и пэйстнул результат в Query Analyzer, то я честно получил 1. А когда я стал распечатывать rs(0), то я обнаружил там 0. Когда я об этом сообщил, наш сиквельный гуру (по совместительству начальник над разработчиками этого чуда техники) всерьез загрузился и стал требовать терминальный доступ к серверу, чтобы увидеть это чудо своими глазами.
From: [identity profile] sergeax.livejournal.com
Если хотите, могу удалить, т.к. явный неспровоцированный наезд.

Ну вот еще. Собака лает - ветер носит. Еще не хватало на анонимусов отвлекаться.

Проблема тут именно та, про которую я говорил - несоответствие кодовых страниц SQL-сервера и ASP. ASP передает серверу строку, содержащую кириллицу, при этом бодро рапортуя, что локаль у нас - американская. Сервер строит запрос, используя американскую локаль, и, ясен хрен, ничего не находит ;) Скорее всего там происходит преобразование в Unicode, при котором слово "администратор" просто превратилось в "?????????????". Проблема решается а) доустановкой 1049 локали в Regional и б) либо установки ее как дефолтной, либо прописывании в начале страницы директивой. Второй вариант несколько универсальнее.

Блин, оказывается серверные директивы нифига не прописались в предыдущем посте. Напишу заново:

<%@LCID=1049%>
<%@Codepage=1251%>
From: [identity profile] pargentum.livejournal.com
Ну собственно и я про то же самое.
То есть проблема нами была диагностирована верно, только лечение, возможно, было назначено чересчур жесткое.
From: [identity profile] toshick.livejournal.com
Вот как раз не надо никогда его ставить в свойствах базы. Иначе описанные проблемы возникают. Поднимать базу из бэкапа в 2000 - ровно то же, что создавать ее скриптом с определенным collation. В предыдущих версиях она просто бы не поднялась с неправильным языком. Веселее всего, конечно, если на одном сервере придется запустить несколько баз с разным collation, неявно создающих временные таблицы. Боюсь, тогда проще будет сделать несколько именованных экземпляров SQL-server'а.

Соединение, насколько мне известно, языковой контекст обработки запросов SQL не определяет вообще (бегло проверил по документации). Никаких передаваемых локалей на уровне соединения с SQL нет. Есть возможность трансляции, но это совершенно не то.

Вероятно, IIS (я с ним не работаю) либо исполняет запросы через собственную интерфейсную базу, с ее языковым контекстом, либо передает символьные строки с явным указанием Collation.


From: [identity profile] pargentum.livejournal.com
>Вот как раз не надо никогда его ставить в свойствах базы. Иначе описанные проблемы возникают.

Век живи, век учись. :) Зато теперь я могу написать в резюме десять инсталляций MS SQL 2000. :)
From: [identity profile] toshick.livejournal.com
ну, если считать все неудачные, то я, наверное, могу уже под сотню ;-)

Profile

pargentum: (Default)
pargentum

December 2025

S M T W T F S
  1 2 3 4 56
78 9 1011 1213
14 1516 17 18 19 20
21 22 23 24 25 26 27
28 293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 05:11 pm
Powered by Dreamwidth Studios