Page 1 sur 1

enregistrement d'un n° de tèl. dans une table

Posté : 16 nov. 2006, 21:14
par bibi85
bonjour,
lorsque je saisis un n°de tèl commençant donc par 0, celui-ci s'enregistre sans le 0 dans ma table, donc lorque je le rapelle il s'affiche sans le 0.
dois-je faire un manip sur la structure de ma table ou sur le php au moment où il s'affiche ?
merci pour votre aide

Posté : 16 nov. 2006, 21:20
par Cyrano
Tu as du utiliser un type de champ numérique et donc s'il commence par 0, le 0 s'efface.

Deux solutions possibles :
-1- changer pour un type CHAR
-2- utiliser l'option zerofill pour forcer le début. Spécifie bien la longueur dans ce cas pour avoir 0 et non 000 ou 00000 par exemple.

Posté : 18 nov. 2006, 23:02
par HanX
perso je te conseille de mettre en char (même chose pour le code postal)

Posté : 18 nov. 2006, 23:11
par iclo
perso je te conseille de mettre en char (même chose pour le code postal)
Il faut peser le pour et le contre, ça prendra plus de place, et pour les recherches ce sera plus pénalisants.

Posté : 18 nov. 2006, 23:27
par Hubert Roksor
Je serais plutôt de l'avis HanX, les numéros de téléphones ne sont pas réellement des données numériques même s'ils sont majoritairement représentés par des chiffres (à l'exception du "+" de l'indicatif du pays, voire le "#" des numéros courts de certains opérateurs... par exemple le répondeur téléphonique de Club Internet s'interroge au #123).

Concernant les performances et les contraintes de stockages (un CHAR(9) prend 9 octets, un INT en prend 4) je pense que même si la base contient des centaines de milliers d'enregistrements les performances devraient rester du même ordre. Après tout, la seule recherche sur ce champs devrait être une simple égalité = et ce type d'opération est très rapide. Pour toutes ces raisons je recommanderais donc de stocker les numéros de téléphones dans un CHAR(10) si on ne stocke que des numéros français et un VARCHAR(20) sinon.

D'ailleurs, je viens de tester rapidement la différence de taille. Pour cela j'ai créé une table avec trois champs (id INT, tel CHAR(10) ou INT, et nom VARCHAR(255)) et je l'ai rempli avec des numéros et des noms au hasard. Les numéros sont formés de la sorte: "0" suivi d'un chiffre de 1 à 6, suivi de 8 chiffres de 0 à 9. Avec 262144 enregistrements, la table fait 7000 KiB de données et 5500 KiB d'index pour un CHAR(10) (ascii_bin) et 5600 KiB + 5250 KiB pour un INT(10) ZEROFILL. Donc en gros, pour 200 000 "clients virtuels" on ne gagne que 2 MiB sur le disque dur. La faible différence de la taille de l'index est dûe à la compression par préfixe utilisée par défaut pour les indices CHAR/VARCHAR, qui est particulièrement efficace ici étant donné que tous les numéros sont très similaires. Je ne saurais pas dire combien on gagne réellement en mémoire car je ne sais pas si les blocs d'indices sont cachés en mémoire sous forme compressée ou décompressée (d'ailleurs, si quelqu'un sait qu'il n'hésite pas ;)).

Au niveau des performances, je n'ai pas les outils pour mesurer précisément, un simple

Code : Tout sélectionner

SELECT * FROM test WHERE tel='0123556789'
prend "0.00" secondes sur mon ordinateur, qu'on utilise un CHAR ou un INT.

Posté : 20 nov. 2006, 10:58
par bibi85
Merci à tous pour toutes ces explications.
bonne journée ! :P