Russian Qt Forum

Программирование => Базы данных => Тема начата: PinkPanther от Апрель 29, 2015, 20:01



Название: [РЕШЕНО] MySQL: SIGNED -> UNSIGNED
Отправлено: PinkPanther от Апрель 29, 2015, 20:01
Когда-то давно в MySQL была создана таблица, которая копит статистику. В ней скопилось около 45 миллионов строк.
Проблема в том, что одно из полей было создано как INT(11), диапазон значений без знака - 31 бит, и бит на минус. Тогда казалось, что этого хватит в запасом, оказалось - нет.
За несколько лет значения выросли до 32 бит без знака, и в таблицу стали ложиться ID вроде -245682794 (автоматически преобразованные сервером из больших SIGNED).
А нужно UNSIGNED, 4 байта, притом как можно быстрее. Попытка создать временную таблицу и запилить туда минусовые значения приводит к ошибке (дублирование значения 0 для уникального столбца - видимо, автоматическое преобразование назад не работает).

Вопрос:

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


Название: Re: MySQL: SIGNED -> UNSIGNED
Отправлено: PinkPanther от Апрель 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