7
votes

SQL Server 4 octets non signés int

Est-ce que quelqu'un connaît-il de tout travail autour de laquelle je peux enregistrer des entiers non signés (0 à 4294967295) en utilisant simplement 4 octets au lieu d'utiliser 8 octets et Bigint?

Je sais que nous pouvons créer des types de données définis par l'utilisateur et créer une contrainte sur eux pour ne pas autoriser les valeurs négatives, mais cela ne me permet toujours pas d'entrer des valeurs supérieures à 2147483647. Je veux seulement utiliser 4 octets mais pouvoir économiser des valeurs entières plus grandes que 2147483647 mais moins de 4294967295.

Dupliquer possible: 4 octets Unsigné Int dans SQL Server?


3 commentaires

DataTypes varient d'un bit juste de la mise en œuvre à la mise en œuvre. Server SQL utilisez-vous MSSQL? mysql?


La balise "SQL-Server" est destinée à Microsoft SQL Server.


m Utilisation de SQL Server 2008 :-) C'est pourquoi je l'ai marqué SQL-Server


4 Réponses :


3
votes

Il n'y a pas de type non signé disponible pour vous, afin que vous puissiez en créer un à l'aide de l'UDT ou optez pour le type de données plus grand. Si vous le faites dans un UDT, vous allez dépasser à nouveau les 4 octets.

Le piratage extrême serait d'appliquer automatiquement un décalage automatiquement à votre valeur stockée après la lecture, en ajoutant -2 ^ 31, mais il s'agit d'un vrai chemin hacky d'y aller et de déranger pour quiconque visionnant le code, etc., et non Mentionnez le potentiel d'erreur / des choses manquées. Je ne recommanderais pas du tout le piratage.


0 commentaires

0
votes

Cette solution peut être légèrement déroutante mais fonctionnera à vos fins. Stockage des valeurs plus grandes que 2 ^ 31-1, les entiers provoquant un débordement et apparaît comme un nombre négatif. Vous pouvez toujours stocker vos valeurs comme des entiers et les réinterpréter dans le code.


1 commentaires

Le comportement du trop-plein est-il défini? Ou varie-t-il par la mise en œuvre?



2
votes

Utilisez un binaire (4). Enveloppez-le dans un UDT si vous voulez.


5 commentaires

Cela utilise réellement 6 octets: les 4 octets de données + 2 octets surhead pour le type de données binaires.


La surcharge est la raison pour laquelle je suis allé avec un int avec une contrainte de contrôle au lieu de binaire (2) pour un uint16 . Vous devrez peut-être également envisager une endianness avec un format de stockage binaire (x) .


@JeffmeatBallyang non, varbinary a une surcharge de 2 octets, binaire n'a aucune. Voyez ici: Smattie.com/2013/01/14/ SQL-Server-Types de données (également désolé, mais j'ai manqué votre commentaire il y a trois ans)


@Benmosher Voir mon commentaire précédent et mon lien. binaire (n) n'a pas de surcharge de stockage supplémentaire.


@RBarryyoung - Ah, cela a du sens, puisqu'il s'agit de largeur fixe. Je ne veux toujours pas gérer l'endianess, même pour deux octets. :-)



0
votes

Comme mentionné par Rbarry, essayez d'utiliser ceci:

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


0 commentaires