2011-08-22 15 views
9

Parece que BIGINT es el entero más grande disponible en MySql, ¿verdad?¿Qué hacer cuando necesitas enteros de más de 20 dígitos en mysql?

¿Qué hacer cuando necesita almacenar un BIGINT (80), por ejemplo?

¿Por qué en algunos casos, como en algún lugar de los documentos de la API de Twitter, nos recomiendan almacenar estos enteros grandes como varchar?

¿Cuál es la verdadera razón detrás de la elección de usar un tipo u otro en este caso?

+0

BIGINT está limitado por definición a 8 bytes. – mozillanerd

Respuesta

18

Los enteros grandes no están limitados a 20 dígitos, están limitados a los números que se pueden expresar en 64 bits (por ejemplo, el número 99,999,999,999,999,999,999 no es un entero válido a pesar de tener 20 dígitos).

La razón por la que tiene esta limitación es que los enteros nativos pueden ser manipulados relativamente rápido por el hardware subyacente, mientras que las versiones textuales de un número (tienden a) deben procesarse de a un dígito por vez.

Si usted quiere un número más grande que el más grande de 64 bits entero sin signo 18,446,744,073,709,551,615, entonces tendrá que almacenarlo como un (otro campo de texto o) varchar y la esperanza de que no es necesario hacer mucho manipulación matemática en él .

Alternativamente, puede buscar en los números de punto flotante que tienen un rango mayor pero menos precisión, o números decimales que le pueden dar 65 dígitos para un valor integral, con decimal(65,0) como el tipo de columna.

+0

¿Cuál es el mejor para las declaraciones 'ORDER' y' WHERE'? (Con índices correctamente establecidos). Por ejemplo 'SELECT column1 FROM tableA WHERE mybigint> N ORDER BY date LIMIT 100000'. En este caso, se utiliza para paginar los resultados. –

+0

@Keyne, los valores decimales funcionarán bien para eso, pero probablemente serán más lentos que los tipos integrales sin procesar. La jerarquía de la velocidad probablemente serán las diversas integrales sin procesar, decimales, varchars justificados cero y varchars injustificados (de más rápido a más lento) pero no deberías confiar en el consejo de algún yobbo en la red, incluso yo :-) Mide, no lo hagas supongo Luego use el más rápido que proporcione el rango que necesita. Específicamente, si necesita 80 dígitos, use varchars justificados (para que 42 se almacene como '0000000000 ... 000000042' por ejemplo). ... – paxdiablo

+0

... Para 25 dígitos, probablemente sea decimal (25,0). Para 19 dígitos, bigint. Y así. Su esquema no está bloqueado para siempre.Si, en algún momento, necesita pasar de 19 a 25 dígitos, entonces realiza los cambios en ese punto de bigint a decimal, de lo contrario, probablemente aplique el principio YAGNI. – paxdiablo

3

Puede especificar un numeric(65,0), pero si necesita agrandarlo, necesitará un varchar.

El motivo para seleccionar uno sobre otro es el uso, la eficiencia y el espacio. Usar un int es más eficiente que un bigint o, creo, numérico si necesita hacer cálculos matemáticos.

2

Puede almacenar enteros grandes como an arbitrary binary string si desea la máxima eficiencia de almacenamiento.

Pero no estoy seguro si vale la pena porque también tendrá que tratar con enteros de más de 64 bits en su aplicación, que también es not the thing you want to do sin una razón importante.

Mejor mantener las cosas simples y usar varchar.

-4

BIGINT está limitado por definición a 8 dígitos. El número máximo de dígitos en el tipo DECIMAL es 64. Debe usar VARCHAR para almacenar valores de mayor precisión y tenga en cuenta que no hay cálculos directos de dichos valores.

+4

bytes, no dígitos. – yan

Cuestiones relacionadas