Me pregunto si hay algún efecto positivo al usar el indicador UNSIGNED para definir algún campo entero en MySQL. ¿Hace que las consultas sean más rápidas o la base de datos más pequeña? ¿O debería molestarme solo si me preocupa el límite superior?Firmado o sin firmar en MySQL
Respuesta
Según section 10.2 del Manual de MySQL 5.1:
En el modo no estricta, cuando un fuera de la gama valor se asigna a una columna de número entero, MySQL almacena el valor que representa la correspondientes punto final del tipo de datos de columna rango. Si almacena 256 en una columna TINYINT o TINYINT SIN CARGO, MySQL almacena 127 o 255, respectivamente. Cuando a-punto flotante o columna de punto fijo se le asigna un valor que excede el rango implicado por la precisión especificada (o predeterminado) y la escala, MySQL almacena el valor que representa la correspondiente punto final de ese rango.
Por lo tanto, usar UNSIGNED solo es realmente necesario cuando le preocupa el límite superior. Además, agregar UNSIGNED no afecta el tamaño de la columna, solo cómo el número es represented.
Use sin signo cuando la columna solo contenga números positivos.
No afectará el rendimiento de E/S en la columna, ya que ocupará exactamente la misma cantidad de espacio.
No importa a menos que esté tratando de sacar el mayor provecho de los valores y no necesite valores negativos.
Por ejemplo, supongamos que quiere almacenar 0-255.
Puede usar una minúscula, pero solo si la usa como no firmada.
Muchas de las bases de datos que he visto, las personas no se molestan en optimizar de esta manera y terminan con algunas tablas bastante grandes porque solo usan INTs todo el tiempo.
Aún así, si estás hablando de int vs unsigned int, no hay efecto de rendimiento o efecto de espacio en absoluto.
Desde el punto de vista de las normas, siempre uso unsigned y solo uso firmado cuando sé que necesitaré valores negativos.
Cuando se trata de rendimiento o almacenamiento, es absolutamente lo mismo.
Como regla general, use la que más le convenga: si solo necesita valores positivos, almacene los valores como SIN FIRMAR; de lo contrario, que sea el valor predeterminado [FIRMADO].
Surge un problema cuando se establece un valor FIRMADO para una columna PRIMARY AUTOINCREMENT: el recuento de los números autogenerados comienza con 1 (no el número negativo más pequeño) y los valores posibles finalizarán antes, ya que solo usará una mitad de valores. Entonces, en este caso (columna PRIMARY + AUTOINCREMENT), es mejor almacenar como UNSIGNED.
Mejorará el rendimiento, supongamos que si desea buscar la cantidad < 50o.
Sin "unsigned": Flujo de proceso, ya que el campo de cantidad es un "int" y tiene un índice de este campo, MySQL definirá el rango como -2147483648 a 500 y obtendrá el resultado basado en esto distancia.
Con "unsigned": Flujo de proceso, ya que el campo de cantidad es un "int" con "unsigned" y tiene un índice de este campo, MySQL definirá el rango de 0 a 500 y obtendrá el resultado basado en este rango
Advertencia, hay un problema con Unsigned Int (UINT) y Entity Framework o ADO.NET. Se podría implicar un problema de integración según la versión de MySQL Connector 6.
En mi experiencia, UInt
se lee como Long
por la EF, lo que podría plantear algunas cuestiones de precisión, ya que no es UInt
Long
. Podría causar dolores de cabeza a cualquiera que no esté familiarizado con el problema.
Otras preocupaciones:
Aquí se puede ver la MySQL documentation para los rangos de FIRMADOS vs. SIN FIRMA intercepciones. Notarás rápidamente que el piso para una INT NO FIRMADA siempre es 0, por lo que nunca puede ser negativo.
Type Storage Minimum Value Maximum Value
(Bytes) (Signed/Unsigned) (Signed/Unsigned)
TINYINT 1 -128 127
0 255
SMALLINT 2 -32768 32767
0 65535
MEDIUMINT 3 -8388608 8388607
0 16777215
INT 4 -2147483648 2147483647
0 4294967295
BIGINT 8 -9223372036854775808 9223372036854775807
0 18446744073709551615
- 1. Tipo int predeterminado: ¿Firmado o sin firmar?
- 2. macro RAND_MAX: ¿firmado o sin firmar?
- 3. Un firmar un jar firmado
- 4. Operadores de desplazamiento bit a bit. Firmado y sin firmar
- 5. mysql Tinyint como no firmado
- 6. Cómo cambiar la clave principal de MySQL de firmado a sin firmar?
- 7. C++: falta de coincidencia firmado/no firmado cuando solo se usan tipos sin firmar
- 8. BOOL y tinyint (1) ... ¿sin firmar?
- 9. ¿Qué significa "sin firmar" en MySQL y cuándo usarlo?
- 10. ¿Cómo puedo corregir advertencias como: "comparación entre firmado y sin firmar"?
- 11. Verificar si un ejecutable está firmado o no (signtool usado para firmar ese exe)
- 12. Convertir BIGINT SIN FIRMAR en INT
- 13. APK sin firmar no se puede instalar
- 14. Cómo restar dos entradas sin firmar con envolvente o desbordamiento
- 15. ¿Firmar respuesta SAML con o sin firma de aserción?
- 16. Palabra clave sin firmar en C++
- 17. byte [] a BigInteger sin firmar?
- 18. Making sin firmar en C++ 11
- 19. es size_t siempre sin firmar?
- 20. Firmando un ensamblaje sin firmar
- 21. Cómo convertir un entero de 32 bits de unsigned a firmado en MySQL o PHP?
- 22. ¿Por qué es posible cargar tipos en un ensamblaje sin firmar desde un ensamblaje firmado usando reflexión?
- 23. Convertir un int sin firmar de 16 bits a un int firmado de 16 bits en C#
- 24. ¿Por qué GCC no produce una advertencia al asignar un literal firmado a un tipo sin firmar?
- 25. Comprensión de los números sin firmar de Java
- 26. menos unario y firmado-a-sin signo de conversión
- 27. Aplicaciones con Android firmado
- 28. ¿Cómo puedo obtener un Applet Java firmado para realizar operaciones privilegiadas cuando se me llama desde un Javascript sin firmar?
- 29. ¿Qué lib o software para firmar y verificar a ciegas?
- 30. interpretan como no firmada firmado
Además, hay una mejora en el rendimiento con respecto al índice para aquellos casos en los que solo almacena valores sin firmar. Como dijo @ kevin-loney, puede ahorrar tiempo en la indexación de valores de límite superior. Por favor vea el [artículo que yo había escrito] (http://rakesh.sankar-b.com/2010/08/25/mysql-unsigned-int-to-signed-int-performance-tips-index/) sobre el uso unsigned type over signed. –
¡ERES UN REY, REY, BRO! Acabas de salvarme un montón de cerebro ... por la gerencia de arriba. :-) ¡Gracias! –