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? P>
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. P>
Dupliquer possible: 4 octets Unsigné Int dans SQL Server? P> blockQuote>
4 Réponses :
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. P>
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. P>
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. P>
Le comportement du trop-plein est-il défini? Ou varie-t-il par la mise en œuvre?
Utilisez un binaire (4). Enveloppez-le dans un UDT si vous voulez. P>
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 code> avec une contrainte de contrôle au lieu de
binaire (2) code> pour un
uint16 code>. Vous devrez peut-être également envisager une endianness avec un
format de stockage binaire (x) code>.
@JeffmeatBallyang non, varbinary code> a une surcharge de 2 octets,
binaire code> 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) code> 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. :-)
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
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