Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Добавление в MSSQL кодировки KOI8  [new]
Masygreen
Member

Откуда: Москва
Сообщений: 558
Добрый день!
Если кто знает подсажете ... есть базе строки в кодировке KOI8...
Необходимо организовать вывод их на экран, есно по умолчанию винда не шарит что такое KOI8..
Как добавить такую поддержку на уровне сервера????

как вариант пытаюсь сделать char(ASCII(SUBSTRING(@string, @position, 1))+64) дать смещение в кодах но смещение не линейно ... придется делать таблицу соответствия - а это НЕ КРАСИВО...

Зарание спасибо за советы и за критику :)
23 июл 07, 09:52    [4422019]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62908
На какой экран и зачем их выводить на этот "экран" в KOI8?
23 июл 07, 11:35    [4422703]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
Masygreen
Member

Откуда: Москва
Сообщений: 558
делаю запрос в Query ... далее эти данные пойдут в Reporting Srv...
Это в принцыпе анологичная задача, хочеться без выдумок...просто подключить эту кодировку ...
23 июл 07, 12:41    [4423189]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
Masygreen
Member

Откуда: Москва
Сообщений: 558
на уровне MS SQL 2005
23 июл 07, 12:42    [4423200]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
просто подключить эту кодировку ...


Нет такой возможности "подключить".
23 июл 07, 13:11    [4423386]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
Masygreen
Member

Откуда: Москва
Сообщений: 558
ПРОБЛЕМА РЕШЕНА ЕСЛИ КОМУ НАДО ТО ВОТ КОД
ВСЕМ СПАСИБО КТО ПРИНИМАЛ УЧАСТИЕ В ОБСУЖДЕНИИ

DECLARE @SMEM varchar(100)
DECLARE @VMEM varchar(100)
DECLARE @position int
DECLARE @ncod bigint
DECLARE @dcod bigint

SET @VMEM=(select
CAST(SUBSTRING(XX$Memo.m#Data, 4,100) AS char(100))
from XX$Memo
where XX$Memo.m#nrec=0x80010000000004F9 and m#code=1705)


SET @position = 1
SET @SMEM=''

WHILE @position <= DATALENGTH(@VMEM)
BEGIN
SET @ncod=ASCII(SUBSTRING(@VMEM, @position, 1))
IF @ncod=240 SET @dcod=ascii('Ё')
IF @ncod=241 SET @dcod=ascii('ё')
/*все осталные*/
IF @ncod<=127 SET @dcod=@ncod
/*РАЗБОР ЗАГЛАВНЫХ БУКОВ*/
IF @ncod>127 AND @ncod<160 SET @dcod=@ncod+64
/*проба первой половины мелких */
IF @ncod>159 AND @ncod<177 SET @dcod=@ncod+64
/*проба первой половины мелких */
IF @ncod>220 AND @ncod<240 SET @dcod=@ncod+16
SET @SMEM=@SMEM+char(@dcod)
SET @position = @position+1
END
24 июл 07, 10:40    [4426963]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Вместо множества IF воспользуйтесь CASE.
24 июл 07, 16:39    [4430049]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Добавление в MSSQL кодировки KOI8  [new]
hibou
Member

Откуда:
Сообщений: 2
Код Masygreen у меня возвращает какую-то бороду, но я его немного переделал и облагородил, может быть кому-то пригодится:

CREATE FUNCTION fromKOI8R 
(
	@koi8r varchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
	DECLARE @str nvarchar(max)
	DECLARE @position int
	DECLARE @chr bigint

	SET @position = 1
	SET @str = ''
	
	WHILE @position <= DATALENGTH(@koi8r)
	BEGIN
		SET @chr = ASCII( SUBSTRING(@koi8r, @position, 1) )
		SET @str = @str + CASE
			WHEN @chr < 128	THEN CHAR(@chr)
			WHEN @chr = 163 THEN 'ё'
			WHEN @chr = 179 THEN 'Ё'
			WHEN @chr = 192 THEN 'ю'
			WHEN @chr = 193 THEN 'а'
			WHEN @chr = 194 THEN 'б'
			WHEN @chr = 195 THEN 'ц'
			WHEN @chr = 196 THEN 'д'
			WHEN @chr = 197 THEN 'е'
			WHEN @chr = 198 THEN 'ф'
			WHEN @chr = 199 THEN 'г'
			WHEN @chr = 200 THEN 'х'
			WHEN @chr = 201 THEN 'и'
			WHEN @chr = 202 THEN 'й'
			WHEN @chr = 203 THEN 'к'
			WHEN @chr = 204 THEN 'л'
			WHEN @chr = 205 THEN 'м'
			WHEN @chr = 206 THEN 'н'
			WHEN @chr = 207 THEN 'о'
			WHEN @chr = 208 THEN 'п'
			WHEN @chr = 209 THEN 'я'
			WHEN @chr = 210 THEN 'р'
			WHEN @chr = 211 THEN 'с'
			WHEN @chr = 212 THEN 'т'
			WHEN @chr = 213 THEN 'у'
			WHEN @chr = 214 THEN 'ж'
			WHEN @chr = 215 THEN 'в'
			WHEN @chr = 216 THEN 'ь'
			WHEN @chr = 217 THEN 'ы'
			WHEN @chr = 218 THEN 'з'
			WHEN @chr = 219 THEN 'ш'
			WHEN @chr = 220 THEN 'э'
			WHEN @chr = 221 THEN 'щ'
			WHEN @chr = 222 THEN 'ч'
			WHEN @chr = 223 THEN 'ъ'
			WHEN @chr = 224 THEN 'Ю'
			WHEN @chr = 225 THEN 'А'
			WHEN @chr = 226 THEN 'Б'
			WHEN @chr = 227 THEN 'Ц'
			WHEN @chr = 228 THEN 'Д'
			WHEN @chr = 229 THEN 'Е'
			WHEN @chr = 230 THEN 'Ф'
			WHEN @chr = 231 THEN 'Г'
			WHEN @chr = 232 THEN 'Х'
			WHEN @chr = 233 THEN 'И'
			WHEN @chr = 234 THEN 'Й'
			WHEN @chr = 235 THEN 'К'
			WHEN @chr = 236 THEN 'Л'
			WHEN @chr = 237 THEN 'М'
			WHEN @chr = 238 THEN 'Н'
			WHEN @chr = 239 THEN 'О'
			WHEN @chr = 240 THEN 'П'
			WHEN @chr = 241 THEN 'Я'
			WHEN @chr = 242 THEN 'Р'
			WHEN @chr = 243 THEN 'С'
			WHEN @chr = 244 THEN 'Т'
			WHEN @chr = 245 THEN 'У'
			WHEN @chr = 246 THEN 'Ж'
			WHEN @chr = 247 THEN 'В'
			WHEN @chr = 248 THEN 'Ь'
			WHEN @chr = 249 THEN 'Ы'
			WHEN @chr = 250 THEN 'З'
			WHEN @chr = 251 THEN 'Ш'
			WHEN @chr = 252 THEN 'Э'
			WHEN @chr = 253 THEN 'Щ'
			WHEN @chr = 254 THEN 'Ч'
			WHEN @chr = 255 THEN 'Ъ'			
		END
		SET @position = @position + 1
	END
	
	RETURN @str
END

SELECT fromKOI8R( 'РТПВМЕНБ У мПФХУПН ОЕФ УЛТЕРЛЙ' ) -> 'проблема с Лотусом нет скрепки'
30 янв 11, 16:14    [10154967]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
Masygreen
Member

Откуда: Москва
Сообщений: 558
4 года !!! херасе какой говно код я породил :)
сейчас собственно не лучше :(
18 фев 11, 14:46    [10257801]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Добавление в MSSQL кодировки KOI8  [new]
kurai
Guest
declare @s nvarchar(max)
SET @s = replicate(N'РТПВМЕНБ У мПФХУПН ОЕФ УЛТЕРЛЙ fuck yeah &^$^#%',1000)
CREATE TABLE #t (kod int, sym varchar(1))			
INSERT INTO #t (kod,sym)
VALUES  (179, 'Ё'),(192, 'ю'),(193, 'а'),(194, 'б'),(195, 'ц'),
		(196, 'д'),(197, 'е'),(198, 'ф'),(199, 'г'),
		(200, 'х'),(201, 'и'),(202, 'й'),(203, 'к'),
		(204, 'л'),(205, 'м'),(206, 'н'),(207, 'о'),
		(208, 'п'),(209, 'я'),(210, 'р'),(211, 'с'),
		(212, 'т'),(213, 'у'),(214, 'ж'),(215, 'в'),
		(216, 'ь'),(217, 'ы'),(218, 'з'),(219, 'ш'),
		(220, 'э'),(221, 'щ'),(222, 'ч'),(223, 'ъ'),
		(224, 'Ю'),(225, 'А'),(226, 'Б'),(227, 'Ц'),
		(228, 'Д'),(229, 'Е'),(230, 'Ф'),(231, 'Г'),
		(232, 'Х'),(233, 'И'),(234, 'Й'),(235, 'К'),
		(236, 'Л'),(237, 'М'),(238, 'Н'),(239, 'О'),
		(240, 'П'),(241, 'Я'),(242, 'Р'),(243, 'С'),
		(244, 'Т'),(245, 'У'),(246, 'Ж'),(247, 'В'),
		(248, 'Ь'),(249, 'Ы'),(250, 'З'),(251, 'Ш'),
		(252, 'Э'),(253, 'Щ'),(254, 'Ч'),(255, 'Ъ')
SELECT(
 SELECT  ISNULL(#t.sym, SUBSTRING(@s,m.number,1))
 FROM master.dbo.spt_values m LEFT JOIN #t ON #t.kod = ASCII(SUBSTRING(@s,m.number,1))
 WHERE m.type = 'p' AND number BETWEEN 1 AND LEN(@s)
 ORDER BY number
for xml path(''),type).value('.','nvarchar(max)')
DROP TABLE #t
30 ноя 12, 10:57    [13554295]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kurai,

Ага. Только выходное значение у вас обрезается до 2047 символов.
А переменная @s в таком коде:
declare @s nvarchar(max)
SET @s = replicate(N'РТПВМЕНБ У мПФХУПН ОЕФ УЛТЕРЛЙ fuck yeah &^$^#%',1000)

имеет длину 3995 символов, а не 47000 символов.

Ах да, ещё не работает в базах с некириллическим коллейшеном. Надо бы функцию UNICODE использовать вместо ASCII.
30 ноя 12, 11:46    [13554646]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
Гость333
Member

Откуда:
Сообщений: 3683
И в таблице #t поле sym имеет тип varchar(1)? Рукалицо, в общем :) Хотя сама идея хорошая.
30 ноя 12, 11:51    [13554698]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
kurai
Guest
Гость333,

ну да, писалось на коленке в перерыве между пряниками, varchar(max) строки только время выполнения увеличивает, лучше уж varchar(2048) поставить
30 ноя 12, 14:15    [13555941]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
kurai_
Guest
Гость333,

И еще пара оправданий)))
1. replicate вообще был использован в качестве "сферического коня в вакууме" и над его длинной вообще не заморачивался
2. varchar(1) вместо char был использован вообще по случйному стечению обстоятельств и для данной таблицы почти не имеет значения этот тип - не те масштабы , хотя это и не отменяет моей вины за невнимательность и размещение кода с глупыми ошибками.
30 ноя 12, 14:52    [13556307]     Ответить | Цитировать Сообщить модератору
 Re: Добавление в MSSQL кодировки KOI8  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kurai_
varchar(1) вместо char был использован вообще по случйному стечению обстоятельств

Да я не про длину, а про использование не-юникодного типа данных, хотя начинается всё с "declare @s nvarchar(max)" и заканчивается "value('.','nvarchar(max)')". На самом деле мелочи это всё, кому надо, тот допилит.
30 ноя 12, 15:04    [13556420]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить