Что делать, если вам нужны целые числа больше 20 цифр в mysql?

Похоже, что BIGINT — самое большое целое число, доступное в MySQL, верно?

Что делать, например, если вам нужно сохранить BIGINT (80)?

Почему в некоторых случаях, например где-то в документации API Twitter, нам рекомендуют хранить эти большие целые числа как varchar?

Какова реальная причина выбора использования одного типа над другим?


person Keyne Viana    schedule 22.08.2011    source источник
comment
BIGINT по определению ограничен 8 байтами.   -  person mozillanerd    schedule 22.08.2011


Ответы (4)


Большие целые числа на самом деле не ограничены 20 цифрами, они ограничены числами, которые могут быть выражены в 64 битах (например, число 99,999,999,999,999,999,999 не является допустимым большим целым числом, несмотря на то, что оно состоит из 20 цифр).

Причина, по которой у вас есть это ограничение, заключается в том, что целые числа в собственном формате могут манипулироваться базовым оборудованием относительно быстро, тогда как текстовые версии числа (как правило) должны обрабатываться по одной цифре за раз.

Если вам нужно число больше, чем самое большое 64-битное целое число без знака 18,446,744,073,709,551,615, вам нужно будет сохранить его как varchar (или другое текстовое поле) и надеяться, что вам не нужно выполнять с ним много математических манипуляций.

В качестве альтернативы вы можете изучить числа с плавающей запятой, которые имеют больший диапазон, но меньшую точность, или десятичные числа, которые должны дать вам 65 цифр для целочисленного значения с decimal(65,0) в качестве типа столбца.

person paxdiablo    schedule 22.08.2011
comment
Что лучше всего подходит для операторов ORDER и WHERE? (с правильно установленными индексами). Например SELECT column1 FROM tableA WHERE mybigint > N ORDER BY date LIMIT 100000. В этом случае используется для разбиения результатов на страницы. - person Keyne Viana; 22.08.2011
comment
@Keyne, для этого подойдут десятичные значения, но, вероятно, они будут медленнее, чем необработанные целочисленные типы. Иерархия скорости, вероятно, будет состоять из различных необработанных интегралов, десятичных дробей, varchars с нулевым выравниванием и varchars без выравнивания (от самого быстрого к самому медленному), но вы не должны доверять советам какого-то кретина в сети, даже мне :-) Измеряйте, не я думаю. Затем используйте самый быстрый, который обеспечивает необходимый диапазон. В частности, если вам нужно 80 цифр, используйте выравнивание varchars (например, чтобы 42 сохранялось как 0000000000...000000042). ... - person paxdiablo; 22.08.2011
comment
... Для 25 цифр, вероятно, десятичный (25,0). Для 19 цифр, bigint. И так далее. Ваша схема не заблокирована навсегда. Если в какой-то момент вам нужно перейти от 19 к 25 цифрам, тогда вы делаете изменения в этой точке с bigint на decimal, в противном случае, вероятно, применяется принцип YAGNI. - person paxdiablo; 22.08.2011

Вы можете указать numeric(65,0), но если вам нужно увеличить размер, вам понадобится varchar.

Причиной выбора одного из них является использование, эффективность и пространство. Использование int более эффективно, чем bigint или, как мне кажется, numeric, если вам нужно выполнить над ним математические операции.

person Doug Kress    schedule 22.08.2011

Вы можете хранить эти большие целые числа как произвольную двоичную строку если вам нужна максимальная эффективность хранения.

Но я не уверен, стоит ли оно того, потому что вам придется иметь дело с более чем 64-битными целыми числами в вашем приложении, что также не то, что вы хотите сделать без веской причины.

Лучше не усложняйте и используйте varchar.

person sanmai    schedule 22.08.2011

BIGINT по определению ограничен 8 цифрами. Максимальное количество цифр в типе DECIMAL — 64. Вы должны использовать VARCHAR для хранения значений большей точности и помнить, что для таких значений нет прямой математики.

person mozillanerd    schedule 22.08.2011