Russian Qt Forum
Апрель 25, 2024, 03:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] MySQL: SIGNED -> UNSIGNED  (Прочитано 6476 раз)
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« : Апрель 29, 2015, 20:01 »

Когда-то давно в MySQL была создана таблица, которая копит статистику. В ней скопилось около 45 миллионов строк.
Проблема в том, что одно из полей было создано как INT(11), диапазон значений без знака - 31 бит, и бит на минус. Тогда казалось, что этого хватит в запасом, оказалось - нет.
За несколько лет значения выросли до 32 бит без знака, и в таблицу стали ложиться ID вроде -245682794 (автоматически преобразованные сервером из больших SIGNED).
А нужно UNSIGNED, 4 байта, притом как можно быстрее. Попытка создать временную таблицу и запилить туда минусовые значения приводит к ошибке (дублирование значения 0 для уникального столбца - видимо, автоматическое преобразование назад не работает).

Вопрос:

Как преобразовать минусовые значения и получить ID в том виде, как он выглядел до автоматического преобразования в SIGNED сервером?
Можно ли это сделать средствами запроса MySQL? Попытка использовать CAST приводит к преобразованию в BIGINT (64 бита), что совсем не нужно.
В принципе, можно сделать это и скриптом PHP. Подскажите пожалуйста, как вычислить исходное значение?
« Последнее редактирование: Апрель 30, 2015, 05:25 от PinkPanther » Записан

Эвтаназия - наше хобби!
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #1 : Апрель 30, 2015, 05:25 »

abc2 - пустая таблица с UNSIGNED столбцом
abc - полная таблица с SIGNED столбцом
x - столбец со значениями, испорченными знаком

INSERT INTO abc2 (id, x, y, x) SELECT id, x+4294967296, y, z FROM abc WHERE x < 0
Записан

Эвтаназия - наше хобби!
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 22.