Название: [РЕШЕНО] 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 |