2016-12-29 1 views
2

Мне пришлось работать в проекте, где у нас есть идентификатор в HEX.Почему два разных целых числа могут быть преобразованы в один и тот же номер HEX?

Пример: B900001752F10001, получен в парсере, разработанном в JAVA в переменной SIGNED LONG. Мы сохраняем эту переменную в переменной SIGNED BIGINT в MySQL DB.

Каждый раз, когда нам нужна цепочка HEX, мы используем функцию HEX (код), и получаем то, что ожидается.

Но когда мы должны предоставление мастер-таблицы, мы должны вводить допустимые коды, чтобы добиться того, что мы использовали что-то вроде:

Update employee set code=0xB900001752F10001 where main_employee_id=1002;

он работал в прошлом производстве код, который будет храниться в БД в

13330654997192441857

, но теперь мы используем ту же самую точную инструкцию, и мы получаем код, хранящийся в БД, как

-5116089076517109759

Таким образом, сравнивая эти два числа с помощью функции HEX, они обеспечивают тот же НОМЕР НОМЕРА.

select HEX(-5116089076517109759), HEX(13330654997192441857) 
0xB900001752F10001, 0xB900001752F10001 

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

Я бежал без какой-либо другой идеи, я ценю любую помощь.

ответ

2

Я думаю, что вы переполнили тип данных.

Согласно MySQL manual, подписанная BIGINT находится в диапазоне

-9,223,372,036,854,775,808 

к

9,223,372,036,854,775,807 

Ваш номер

18,446,744,073,709,551,615 

превысил выше плюсовой, связанный с тем, что переливается и интерпретируется как отрицательное число.

Сказав это, я думаю, что вы все еще можете быть в порядке с вашей командой - только когда вы пытаетесь интерпретировать шестнадцатеричный шаблон как число, результат выглядит запутанным.

Update employee set code=0xB900001752F10001 where main_employee_id=1002; 
0

64bite машина, верхняя цифра знаковый бит, поэтому самый большой Num является 9.223.372.036.854.775.807, но если ур Num больше, чем он, верхняя цифра трансформирует быть 1, так что Num будет отрицательным, и его переполняли. поэтому ур 13330654997192441857 станет до 5116089076517109759.

 Смежные вопросы

  • Нет связанных вопросов^_^