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

Eléphanteau du PHP | 25 Messages

16 nov. 2006, 21:14

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

Mammouth du PHP | 19672 Messages

16 nov. 2006, 21:20

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 197 Messages

18 nov. 2006, 23:02

perso je te conseille de mettre en char (même chose pour le code postal)

ViPHP
ViPHP | 2144 Messages

18 nov. 2006, 23:11

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.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

18 nov. 2006, 23:27

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.

Eléphanteau du PHP | 25 Messages

20 nov. 2006, 10:58

Merci à tous pour toutes ces explications.
bonne journée ! :P