powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как преобразовать HEX=строку в INT
23 сообщений из 23, страница 1 из 1
Как преобразовать HEX=строку в INT
    #38995205
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С интербейзом/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
Как преобразовать HEX=строку в INT
    #38995216
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Migelle,

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

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



или пиши свою UDF
...
Рейтинг: 0 / 0
Как преобразовать HEX=строку в INT
    #38995223
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как преобразовать HEX=строку в INT
    #38995230
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Migelle,

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

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

Код: sql
1.
as bigint 



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

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

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


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


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

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

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


В этой версии, кстати, такой cast тоже работает, только нет подходящего типа :(
...
Рейтинг: 0 / 0
Как преобразовать HEX=строку в INT
    #38995402
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как преобразовать HEX=строку в INT
    #38995403
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как преобразовать HEX=строку в INT
    #38995407
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил себя - всё зависит от диалекта БД.
В 1-ом не получится.
В 3-ем получится даже с BIGINT.

PS поддержка "Hexadecimal Numeric and Binary String Literals" появилась в 2.5, посему в версии FB я не сомневаюсь
...
Рейтинг: 0 / 0
Как преобразовать HEX=строку в INT
    #38995408
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как преобразовать HEX=строку в INT
    #38995508
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так все-таки, если отвлечься от типов, пусть будет NUMERIC
Как его нормально в строку преобразовать? Неужели в firebird нет нормальных функций форматирования строк?
...
Рейтинг: 0 / 0
Как преобразовать HEX=строку в INT
    #38995521
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MigelleНеужели в firebird нет нормальных функций форматирования строк?а в оракле есть?
...
Рейтинг: 0 / 0
Как преобразовать HEX=строку в INT
    #38995563
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,

есть. Насколько они нормальные это уже другой вопрос. В стандарте такое вообще есть? По моему нет. В этом вопросе каждая СУБД делает как взбредёт в голову.
...
Рейтинг: 0 / 0
Как преобразовать HEX=строку в INT
    #38995573
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MigelleТак все-таки, если отвлечься от типов, пусть будет NUMERIC
Как его нормально в строку преобразовать?Показывай свой HEX2INT
...
Рейтинг: 0 / 0
Как преобразовать HEX=строку в INT
    #38995675
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНасколько они нормальные это уже другой вопрос.по моему это ключевой вопрос :)
смысл в том, что сравнивать разные СУБД - это не очень умно в разрезе конкретной решаемой задачи, стоит использовать возможности того, с чем работаешь.
ЗЫ по сабжу я бы вспомнил перевод изи системы в систему и написал бы процедуру.
...
Рейтинг: 0 / 0
Как преобразовать HEX=строку в INT
    #38995789
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как преобразовать HEX=строку в INT
    #38995852
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как преобразовать HEX=строку в INT
    #38997006
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladMigelle,это не компилируется ибо numeric(20) не бывает.
Странно, у меня скомпилировалось и работало....
hvladMigelle,
Сделай 15 и возвращай его - тебе же число нужно, а не строка ?

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


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