powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / преобразование unsigned -> signed
5 сообщений из 5, страница 1 из 1
преобразование unsigned -> signed
    #39767830
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте Господа,
Скажите, как преобразовать число из без знакового в знаковое?

4278190080 FF000000

Одна из проблем то, что

SELECT CAST(UNHEX ('FF000000') AS SIGNED)

дает 0

MySql 5 и 8

Нужно для 4 и 8 байтового INT BIGINT
...
Рейтинг: 0 / 0
преобразование unsigned -> signed
    #39767879
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А при чём тут UNHEX? Для шестнадцатеричных чисел обратное HEX() преобразование выполняется функцией CONV(). При этом строковый параметр однозначно интерпретируется как BIGINT.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
mysql> SELECT HEX(-6917529027641081856);
+---------------------------+
| HEX(-6917529027641081856) |
+---------------------------+
| A000000000000000          |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT CONV('A000000000000000',16,10);
+--------------------------------+
| CONV('A000000000000000',16,10) |
+--------------------------------+
| 11529215046068469760           |
+--------------------------------+
1 row in set (0.00 sec)

mysql> SELECT CONV('A000000000000000',16,-10);
+---------------------------------+
| CONV('A000000000000000',16,-10) |
+---------------------------------+
| -6917529027641081856            |
+---------------------------------+
1 row in set (0.00 sec)
...
Рейтинг: 0 / 0
преобразование unsigned -> signed
    #39768224
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaА при чём тут UNHEX? Для шестнадцатеричных чисел обратное HEX() преобразование выполняется функцией CONV(). При этом строковый параметр однозначно интерпретируется как BIGINT.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
mysql> SELECT HEX(-6917529027641081856);
+---------------------------+
| HEX(-6917529027641081856) |
+---------------------------+
| A000000000000000          |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT CONV('A000000000000000',16,10);
+--------------------------------+
| CONV('A000000000000000',16,10) |
+--------------------------------+
| 11529215046068469760           |
+--------------------------------+
1 row in set (0.00 sec)

mysql> SELECT CONV('A000000000000000',16,-10);
+---------------------------------+
| CONV('A000000000000000',16,-10) |
+---------------------------------+
| -6917529027641081856            |
+---------------------------------+
1 row in set (0.00 sec)




Мне не нужен никакой UNHEX HEX. Есть поле UNSIGNED INT -- надо получить SIGNED INT. 4294967295 должно стать -1 . Промежуток через HEX использовать или нет -- вопрос открытый.
...
Рейтинг: 0 / 0
преобразование unsigned -> signed
    #39768245
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninЕсть поле UNSIGNED INT -- надо получить SIGNED INT. 4294967295 должно стать -1 .
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
mysql> create table test(val int unsigned);
Query OK, 0 rows affected (0.64 sec)

mysql> insert into test (val) values (0),(123),(2147483647),(2147483648),(4000000000),(4294967295);
Query OK, 6 rows affected (0.15 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select val,
    -> case when val > 2147483647
    ->      then conv(concat(repeat('1',32),bin(val)),2,-10)
    ->      else val end to_signed
    -> from test;
+------------+-------------+
| val        | to_signed   |
+------------+-------------+
|          0 | 0           |
|        123 | 123         |
| 2147483647 | 2147483647  |
| 2147483648 | -2147483648 |
| 4000000000 | -294967296  |
| 4294967295 | -1          |
+------------+-------------+
6 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
преобразование unsigned -> signed
    #39768257
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумно, наверное, делать это в формате пользовательской функции. Что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE FUNCTION uint_to_sint (uint INT UNSIGNED)
RETURNS INT SIGNED
DETERMINISTIC
RETURN (SELECT CASE WHEN uint > 2147483647
                    THEN CONV(CONCAT(REPEAT('1',32),BIN(uint)),2,-10)
                    ELSE uint 
               END);
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / преобразование unsigned -> signed
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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