1062: Duplicate entry ’2147483647′ for key ‘PRIMARY’ или Проблема 2038 года

Наверное помните раскрученную проблему 2000? А все из-за того что кто-то заранее не подумал о том что будет через каких то 30 лет и использовал в программном обеспечении 2-ух значное обозначение года. И надо сказать, что проблема 2000 не единственная в своем роде. Наверное еще рановато об этом говорить, но назревает еще и проблема 2038 года. Поясню что имеется в виду. Попробуйте запустить следующий PHP-код:

1
<?php echo date("d.m.Y H:i", 2147483647); ?>

На выходе получим: 19.01.2038 06:14. А теперь увеличьте число на 1. Получилось 13.12.1901 23:15 что не соответствует истине. А все потому что метка времени UNIX при этом выходит за рамки диапазона типа данных Integer.

Хотя проблема 2038 года — это конечно больше шутка. Но однажды при записи данных в MySQL базу данных я получил ошибку:

1062: Duplicate entry ’2147483647′ for key ‘PRIMARY’

Дело в том что для первичного ключа использовалось поле с типом данных INT. И так получилось, что AUTO INCREMENT вышел за пределы числа 2147483647, максимального для INT. Решение простое в данном случае — пришлось использовать тип данных BIGINT. Так что думайте сами, решайте сами …

Если у вас Bitrix 4 или ABO.CMS 3 и сервер MySQL 4

Если у вас старый Bitrix или ABO.CMS и сервер MySQL 4, будьте готовы к проблемам. Если ваш хостер из лучших побуждений обновит версию сервера MySQL до 5, ваши сайты могут перестать отрываться! У меня проблема возникла на сайте клиента с Bitrix 4.0.10 и на нескольких сайтах с ABO.CMS 3.3. Причина в несовместимости некоторых сложных SQL запросов. Например, запросы вида:

1
SELECT [...] FROM [таблица1], [таблица2] LEFT JOIN [таблица3] WHERE [...]

может ожидать крах. Преобразуйте их в:

1
SELECT [...] FROM [таблица1] JOIN [таблица2] LEFT JOIN [таблица3] WHERE [...]

Многие конфликтные запросы в ABO.CMS находятся в файле /mod/catalog/lib/class.Catalog.php

А чтобы узнать что конфликтует в Bitrix, измените в фаиле /bitrix/php_interface/dbconn.php значение переменной $DBDebug на true. Тогда при открытии сайта в браузере, вы увидите проблемный запрос.