web-dev-qa-db-fra.com

Quel type de données dois-je utiliser pour stocker un numéro de 11 chiffres?

Quel type de données je devrais utiliser pour stocker un numéro de 11 chiffres? Il doit stocker '0' comme premier chiffre.

Par exemple, si je stocke 02421402015, il doit montrer 02421402015. J'ai essayé d'utiliser varchar et cela montre 2421402015.

3
Last Bench Mind

Je suggérerais de stocker le numéro sous forme de BIGINT et d'afficher simplement le numéro comme vous le souhaitez.

DECLARE @Num BIGINT;

SET @Num = 2421402015;

SELECT CONVERT(VARCHAR(11), REPLICATE('0', 11 - LEN(@Num))) 
    + CONVERT(VARCHAR(11), @Num);

Comme indiqué par Aaron Bertrand Dans son commentaire, il est de meilleure performance sage de ne pas calculer la longueur de la chaîne requise de zéros et de tronquer simplement la chaîne de caractères:

SELECT RIGHT(REPLICATE('0', 11) + CONVERT(VARCHAR(11), @Num), 11);

Pour votre numéro d'échantillon, la concaténation se traduirait par "00000000000002421402015", qui serait alors tronquée à raison de 11 chiffres, ce qui permettrait:

02421402015

En fait, comme Sruzky a souligné, cela peut être optimisé davantage à:

SELECT RIGHT('00000000000' + CONVERT(VARCHAR(11), @Num), 11);

Si les utilisateurs transmettront des valeurs avec des zéros de premier plan qui doivent être appariés dans une clause WHERE, je convertirai le terme de recherche en un entier d'abord, puis utilisez-le dans le prédicat, un index peut donc être utilisé.

J'ai écrit un poteau de blog1 Cela détaille comment vous pouvez stocker le numéro sous forme d'entier, tout en fournissant simultanément une méthode élégante pour le nombre à ressembler à celle-ci est stockée dans la base de données avec des zéros de premier plan. Chèque http://www.sqlserver.science/basics/how-do-store-number-with-leading-zeros/ pour les détails! Il existe plusieurs autres méthodes de formatage de la colonne de zéros de pointe, mais les performances de chaque méthode varie tout à fait radicalement; La méthode RIGHT('00000000000' + CONVERT(VARCHAR(11), @Num), 11) ressemble à ce que c'est le plus rapide de loin.


1 - Mon message de blog a été présenté dans le SQL Pass Community Connector News
2 - Suivi post sur la performance de FORMATMESSAGE() Fonction dans SQL Server 2012+

14
Max Vernon

Pour démontrer que ce que vous dites dans votre question n'est pas vrai:

DECLARE @x TABLE(y VARCHAR(11));

INSERT @x(y) VALUES('02421402015');

SELECT y FROM @x;

Résultats:

y
-----------
02421402015

Vous devez nous dire plus de détails sur ce qui se passe afin que nous puissions mieux comprendre votre problème.

Mais surtout, vous devez envisager de séparer le stockage de la présentation. Il est beaucoup plus efficace de stocker un numéro en tant que int (4 octets) ou bigint (8 octets) par opposition à une varchar(11) (11 octets + 2 octets à Indiquez la longueur) et vous obtenez également une validation intégrée (alors que quelqu'un ne peut pas stocker I'm varchar au lieu d'un nombre), arithmétique, etc. Sans conversion implicite ou explicite devenant une nécessité. Un dirigeant 0 Pour l'affichage est trivial pour ajouter votre niveau de présentation, ou même dans SQL Server au moment de la requête si vous le souhaitez vraiment. Il est également trivial d'ajouter ou de supprimer des critères de recherche entrants afin que vous recherchiez les types de données corrects et les plus efficaces, à l'aide du bon type de paramètre, quel que soit ce que l'utilisateur pense qu'ils cherchent et voient ...

6
Aaron Bertrand