2009-10-02 21 views
7

¿Alguien sabe de algún trabajo por el cual puedo guardar enteros sin signo (0 a 4294967295) simplemente usando 4 bytes en lugar de usar 8 bytes y bigint?sql server 4 byte unsigned int

Sé que podemos crear tipos de datos definidos por el usuario y crear una restricción sobre ellos para no permitir valores negativos pero que aún no me permiten ingresar valores por encima de 2147483647. Solo quiero usar 4 bytes pero puedo guardar valores enteros mayor que 2147483647 pero menos de 4294967295.

duplicado posible: 4 byte unsigned int in SQL Server?

+0

tipos de datos varían un poco justo de una implementación a .. qué servidor SQL está usando mssql? mysql? – whatnick

+0

la etiqueta "sql-server" es para Mircosoft SQL Server. – RBarryYoung

+0

m usando el servidor sql 2008 :-) por eso lo etiqueté sql-server – Raj

Respuesta

3

no hay ningún tipo sin firmar a su disposición, por lo que podría crear una con la UDT, o bien optar por el tipo de datos más grande . Si lo haces en un UDT, vas a exceder los 4 bytes nuevamente.

El truco extremo sería aplicar un desplazamiento automáticamente a su valor almacenado después de leerlo, agregando -2^31, pero esta es una forma realmente hacky de hacerlo y confunde a cualquiera que vea el código, etc. mencionar el potencial de errores/cosas que se pierden. No recomendaría el pirateo en absoluto.

0

Esta solución puede ser un poco confusa, pero funcionará para sus propósitos. El almacenamiento de valores superiores a 2^31-1 como enteros causa desbordamiento y aparece como número negativo. Aún puede almacenar sus valores como enteros y reinterpretarlos en código.

+1

¿Está definido el comportamiento del desbordamiento? o varía según la implementación? – Pacerier

2

Utilice un binario (4). Envuélvalo en UDT si lo desea.

+5

Esto realmente usa 6 bytes: los 4 bytes de datos + 2 bytes de sobrecarga para el tipo de datos binarios. –

+0

La sobrecarga es la razón por la que fui con un 'int' con una restricción de verificación en lugar de' binary (2) 'para un' uint16'. También es posible que deba considerar la endianidad con un formato de almacenamiento 'binary (x)'. –

+0

@JeffMeatballYang No, 'varbinary' tiene una sobrecarga de 2 bytes,' binary' no tiene ninguno. Vea aquí: http://www.smattie.com/2013/01/14/sql-server-data-types/ (también, lo siento, pero de alguna manera me perdí su comentario hace tres años) – RBarryYoung

0

Según lo mencionado por RBarry, tratar de usar esto:

declare @bi binary(4) = cast(2147483648 as bigint) 

declare @i int = cast(@bi as binary(4)) 

select @i 

declare @bi2 bigint = cast(cast(@i as binary(4)) as bigint) 

select @bi2