Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как преобразовать HEX=строку в INT / 23 сообщений из 23, страница 1 из 1
29.06.2015, 17:00
    #38995205
Migelle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
С интербейзом/firebird столкнулся первый раз (сам пишу на Оракле).

Дано БД firebird ODS version 10.0 Надо инсертным запросом записать в поле типа varchar число в десятичном виде. Число изначально - четыре байта в HEX, типа 0xFEBA09D2

Попробовал cast-ом: CAST('0xFEBA09D2' as integer ) работает почти как надо но нет UNSIGNED INTEGER a BIGINT и INT64 в этой версии не поддерживаются.

Ok, подумал я, есть же всякие NUMERIC и DECIMAL, взял здесь на форуме процедуру HEX2INT, немного модернизировал ее чтоб возвращала VARCHAR а промежуточное число хранила в DECIMAL. Но столкнулся с тем, что не могу нормально преобразовать DECIMAL в VARCHAR
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> SELECT (select res from hex2int('A') ) AS f2 from RDB$DATABASE;

F2
============
10.00000000

SQL> SELECT (select res from hex2int('11') ) AS f2 from RDB$DATABASE;

F2
============
2.0000e-010


Как преобразовать DECIMAL в строку без дробных частей и эскпоненциальной записи? Сейчас преобразование делаю CAST-ом

Код: sql
1.
2.
3.
  declare variable i numeric(20,0);
   ......
  res=cast(trunc(i) as varchar(16));



Или может проще способы есть?

P.S. Никаких внешних библиотек я в том месте установить не могу.
...
Рейтинг: 0 / 0
29.06.2015, 17:06
    #38995216
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Migelle,

переходи на свежую версию firebird (2.5.4) там такие вещи работают

Код: sql
1.
select CAST('0xFEBA09D' as integer ) from rdb$database



или пиши свою UDF
...
Рейтинг: 0 / 0
29.06.2015, 17:12
    #38995223
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Hello, Migelle!
You wrote on 29 июня 2015 г. 17:10:51:

Migelle> Дано БД firebird ODS version 10.0
> Попробовал cast-ом: CAST('0xFEBA09D2' as integer ) работает почти как
надоу тебя ODS не от этой версии FB.
как так вышло?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.06.2015, 17:18
    #38995230
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Migelle,

вполне вероятно, что раз старая база (ods 10), то в ней первый диалект. А следовательно, decimal использованное тобой разрядности хранится в double precision, т.е. в вещественном числе.
Используй INT вместо DECIMAL, в int как раз 4 байта, целое, и не будет никаких дробей. А ты влепил decimal(15,8) и хочешь чтобы дробной части не было?
...
Рейтинг: 0 / 0
29.06.2015, 17:26
    #38995235
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Hello, Kdv!
You wrote on 29 июня 2015 г. 17:25:11:

Kdv> Используй INT вместо DECIMAL
он хочет DWORD (unsigned) а INT ему даст -21362222.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.06.2015, 19:07
    #38995337
ZeroMQ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
МимопроходящийHello, Kdv!
You wrote on 29 июня 2015 г. 17:25:11:

Kdv> Используй INT вместо DECIMAL
он хочет DWORD (unsigned) а INT ему даст -21362222.

Код: sql
1.
as bigint 



?
...
Рейтинг: 0 / 0
29.06.2015, 19:14
    #38995348
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Hello, Zeromq!
You wrote on 29 июня 2015 г. 19:14:57:

Zeromq> as bigint
на ODS 10.0, ага.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.06.2015, 19:53
    #38995367
ZeroMQ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
МимопроходящийHello, Zeromq!
You wrote on 29 июня 2015 г. 19:14:57:

Zeromq> as bigint
на ODS 10.0, ага.

С FB 1.5 у нас bigint появился? Я уж и забыл...
...
Рейтинг: 0 / 0
29.06.2015, 20:33
    #38995387
Migelle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Мимопроходящийу тебя ODS не от этой версии FB.
как так вышло?


Да я не разбираюсь в версиях. Просто выяснил, что ODS версии 10.0. Посмотрел кому это соответствует - было написано Interbase 6-6.5 или firebird 1.0
Вот из этих исходных данных и пытаюсь решить задачу.
...
Рейтинг: 0 / 0
29.06.2015, 20:39
    #38995395
Migelle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Симонов ДенисMigelle,
переходи на свежую версию firebird (2.5.4) там такие вещи работают


Это не моя БД и переход не возможен.

Симонов Денисили пиши свою UDF
Непонятно что именно писать.

А как вообще в то время обходились без long-ов? Даже кларион, который подревнее, их имел в то время.
...
Рейтинг: 0 / 0
29.06.2015, 20:42
    #38995398
Migelle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Симонов Денистам такие вещи работают
Код: sql
1.
select CAST('0xFEBA09D' as integer ) from rdb$database


В этой версии, кстати, такой cast тоже работает, только нет подходящего типа :(
...
Рейтинг: 0 / 0
29.06.2015, 20:48
    #38995402
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
MigelleЭто не моя БД и переход не возможен.
Firebird 2.5 умеет работать с ODS 10. Про Firebird 1.0 говорить малоперспективно. Вопрос в том, что надо получить в итоге. Либо это будет геморрой с 1.0, либо это будет проще с 2.5.

MigelleА как вообще в то время обходились без long-ов?
если в базе диалект 1, то максимально большое целое - INT. Если в базе диалект 3, то BIGINT.
http://www.ibase.ru/ibfaq.htm#dial
...
Рейтинг: 0 / 0
29.06.2015, 20:50
    #38995403
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
MigelleПопробовал cast-ом: CAST('0xFEBA09D2' as integer ) работает почти как надо но нет UNSIGNED INTEGER a BIGINT и INT64 в этой версии не поддерживаются.1. UNSIGNED INTEGER нет в SQL Standard
2. BIGINT - это синоним для NUMERIC(18, 0), и он тебе не нужен для 4-х байтных чисел - достаточно 10 знаков
3. Попробуй добавить лидирующий 0 в свою константу: CAST('0x0FEBA09D2' as NUMERIC(15, 0))
...
Рейтинг: 0 / 0
29.06.2015, 20:58
    #38995407
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Проверил себя - всё зависит от диалекта БД.
В 1-ом не получится.
В 3-ем получится даже с BIGINT.

PS поддержка "Hexadecimal Numeric and Binary String Literals" появилась в 2.5, посему в версии FB я не сомневаюсь
...
Рейтинг: 0 / 0
29.06.2015, 20:58
    #38995408
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Migelle,

не знал что это в 1.0 работало. Значит с нативными 16 ричными литералами перепутал.

Код: sql
1.
select 0x0FEBA09D2009 as n from rdb$database



кстати в трёшке это работает даже в 1 диалекте. А вот так же не пропускает

Код: sql
1.
select cast('0x0FEBA09D2009' as bigint) as n from rdb$database
...
Рейтинг: 0 / 0
30.06.2015, 08:03
    #38995508
Migelle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Так все-таки, если отвлечься от типов, пусть будет NUMERIC
Как его нормально в строку преобразовать? Неужели в firebird нет нормальных функций форматирования строк?
...
Рейтинг: 0 / 0
30.06.2015, 08:20
    #38995521
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
MigelleНеужели в firebird нет нормальных функций форматирования строк?а в оракле есть?
...
Рейтинг: 0 / 0
30.06.2015, 09:26
    #38995563
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
roadster,

есть. Насколько они нормальные это уже другой вопрос. В стандарте такое вообще есть? По моему нет. В этом вопросе каждая СУБД делает как взбредёт в голову.
...
Рейтинг: 0 / 0
30.06.2015, 09:34
    #38995573
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
MigelleТак все-таки, если отвлечься от типов, пусть будет NUMERIC
Как его нормально в строку преобразовать?Показывай свой HEX2INT
...
Рейтинг: 0 / 0
30.06.2015, 10:54
    #38995675
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Симонов ДенисНасколько они нормальные это уже другой вопрос.по моему это ключевой вопрос :)
смысл в том, что сравнивать разные СУБД - это не очень умно в разрезе конкретной решаемой задачи, стоит использовать возможности того, с чем работаешь.
ЗЫ по сабжу я бы вспомнил перевод изи системы в систему и написал бы процедуру.
...
Рейтинг: 0 / 0
30.06.2015, 12:04
    #38995789
Migelle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
hvladПоказывай свой HEX2INT
Да там смотреть нечего особо, я ключевые вещи же показал.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create or alter procedure HEX2INT (
    HEX char(12))
returns (
    res varchar(16))
AS
  declare variable hexdigit char(16) = '0123456789ABCDEF';
  declare variable i numeric(20,0);
begin
  hex = upper(trim(hex));
  i = 0;
  while (hex != '') do begin
    i = i*16 + position(substring(hex from 1 for 1) in hexdigit) - 1;
    hex = substring(hex from 2);
  end
  res=cast(trunc(i) as varchar(16));
  suspend;
end`
...
Рейтинг: 0 / 0
30.06.2015, 12:38
    #38995852
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
Migelle,

это не компилируется ибо numeric(20) не бывает.
Сделай 15 и возвращай его - тебе же число нужно, а не строка ?
Зачем тебе там trunc я даже знать не хочу.
Если хочется и строку, то не вижу проблем отрезать от неё дробную часть вместе с точкой.

PS процедура весьма не эффективна
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create or alter procedure hex2int (
  hex varchar(12)
)
returns (
  res varchar(16), num numeric(15, 0)
)
as
declare hexdigit char(16) = '0123456789ABCDEF';
declare i int;
declare l int;
begin
  hex = upper(trim(hex));
  i = 1;
  l = char_length(hex);
  num = 0;
  while (i <= l) do
  begin
    num = num * 16 + position(substring(hex from i for 1) in hexdigit) - 1;
    i = i + 1;
  end

  res = num;
  res = left(res,  position('.', res) - 1);
  suspend;
end

...
Рейтинг: 0 / 0
01.07.2015, 15:52
    #38997006
Migelle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать HEX=строку в INT
hvladMigelle,это не компилируется ибо numeric(20) не бывает.
Странно, у меня скомпилировалось и работало....
hvladMigelle,
Сделай 15 и возвращай его - тебе же число нужно, а не строка ?

Если бы число... А мне нужна именно строка.
Ну да ладно, всем спасибо, решили другим способом, за пределами firebird.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как преобразовать HEX=строку в INT / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]