В базах данных SQL вы можете хранить целые числа в основном как SMALLINT 2¹⁵-1
, INTEGER 2³¹-1
и BIGINT 2⁶³-1
, всегда было интересно, почему не просто INT
🧐. SMALLINT
слишком мал, INTEGER
для миллисекунд составляет всего 49.7 дней, так что нам остается BIGINT
и тут начинается самое сложное — числа JavaScript.
Константа MAX_SAFE_INTEGER имеет значение 9007199254740991 (9,007,199,254,740,991 или ~9 квадриллионов). Это число объясняется тем, что JavaScript использует числа формата двойной точности с плавающей точкой, как указано в IEEE 754, и может безопасно представлять только целые числа от -2⁵³+1 до 2⁵³-1.
Для больших целых чисел лучше использовать BigInt.
Кому нравится bigint в JS? Вы должны преобразовать числа в bigint, прежде чем сможете работать с ними, вы не можете просто передать bigint в JSON-ответ API, они хитрые. Это именно те проблемы, с которыми недавно столкнулся мой товарищ по команде в проекте. Так что же делать?
Можно предположить, что в обозримом будущем мы никогда не превысим 2⁵³ миллисекунды. Я примерно подсчитал с ним во время телефонного разговора, и у меня сложилось впечатление, что это будет больше, чем продолжительность жизни Вселенной, которая составляет ~13,4 миллиарда лет, но когда я взялся за клавиатуру, то обнаружил, что это всего лишь 285 427 лет. Это число не столь драматично, но его более чем достаточно, чтобы люди будущего могли отлаживать код в поисках того, почему ваш сервис путает даты на веб-странице.
Именно поэтому мы создали конфигурацию для bigints и bigserials в DrizzleORM, чтобы вы могли автоматически наслаждаться страной чисел.
bigserial("will_be_number", maxBytes: "max_bytes_53");
bigserial("will_be_bigint", maxBytes: "max_bytes_64");
спасибо!