Bonjour,
Je me permets de poster ce message, car j'ai plusieurs questions en rapport avec le sql
1/ Les formats TINYTEXT, TEXT, MEDIUMTEXT et LONGTEXT ne prennent pas de valeur (ex: TINYTEXT(50)). Un TINYTEXT, c'est 255 caractères maximum. Un texte qui ferait 300 caractères serait donc tronqué ? Un texte qui ferait 100 caractères prendrait autant de place qu'un texte de 255 caractères ? Pourquoi la limite d'un TINYTEXT est de 255 caractères et non 256 caractères (2^8) ?
2/ Quelle est la valeur maximale pour un VARCHAR ? Je n'arrive pas à trouver une source sûre qui pourrait me donner ce renseignement.
3/ Imaginons un CHAR(10). Si la chaîne de caractères fait 5 caractères, il y aura un complément de 5 blancs pour arriver à 10 caractères. C'est ça ? C'est la seule différence avec un VARCHAR, ce dernier ne stockant que la chaîne utile ?
4/ Dans la vidéo de @Grafikart, il indique un moment donné "qu'un TINYINT est stocké sur 1 octet... on aura donc 2^8 : 256 possibilités". Je ne vois pas le rapport entre le fait que ça soit stocké sur 1 octet et le fait que ça fasse 2^8. Je ne vois pas comment il en est arrivé à cette conclusion... pourquoi 2^8, et non 1^8 ou 3^8, ... ?
5/ Que veut dire "octets" dans ce cas là ? Prenons l'exemple d'un SMALLINT qui est normalement stocké sur 2 octets... ce qui donne 65 535 possbilités. Cela veut dire que si on stocke le chiffre "3"... cela va prendre autant de place que le chiffre "65 533", soit 2 octets dans les 2 cas ?
6/ Par rapport à la question précédente, le "65535 possbilités"... cela veut dire que si on souhaite stocker le chiffre "65540", cela ne passera pas en SMALLINT ? Le "possibilité" correspond au nombre maximal stockable ?
7/ Par exemple :
Comment nommer la seconde table (je ne me souviens plus du nom technique de ce type de table... table de liaison... je doute ?) :
8/ Vaut-il mieux nommer un champ "TITLE" ou "NAME", "DESCRIPTION" ou "CONTENT"... je pense que c'est avant tout une question de préférence... ou y-a-t-il une règle à appliquer pour donner de bons noms aux champs ?
9/ Vaut-il mieux nommer la clé primaire d'une Table (ex : la table Tickets), simplement ID ou TICKETS_ID ?
10/ Je vois souvent les champs date nommés ainsi : "DATE_START", "DATE_END", ... pourquoi préciser le type (ici DATE), alors que ce dernier est indiqué via le format du champ (DATETIME, ...)... nommer simplement "START", "END" ne serait pas plus simple ?
11/ Y-a-t-il une différence entre un VARCHAR(255) et un TINYTEXT (qui est limité à 255 caractères) ?
12/ Je ne comprends pas la différence entre BOOL et BOOLEAN ?
13/ Sur ce screenshot http://s13.postimg.org/ne3hrifbr/workbench.jpg, on voit que les liaisons sont deux types : en trait ou en pointillés... quel est la différence entre ces deux types de liaisons ?
Merci pour vos réponses
Hello,
Je n'ai pas énormément donc je vais juste répondre à la question 4.
Qu'est ce qu'un octet? Un bloc de 8 bits.
Chaque bit peut prendre 2 valeurs: 1 ou 0.
Prenons l'exemple d'un bloc de 2 bit, tu peux avoir les valeurs suivantes:
soit 4 valeurs différentes, soir 2^2. Le principe est le même pour un bloc de 8 bits => 2^8 = 256 possibilités.
En espérent avoir pu aider.
Cordialement,
TD
Bonjour,
Pour la 1) et 11) les champs de type TEXT, TINYTEXT ... ne sont pas stockés dans l'enregistrement lui-même contrairement à CHAR et VARCHAR
Chaque champ démarre par une variable qui indique le nombre de caractères stockés (en fait ça indique le nombre d'octets occupés), pour TINYTEXT c'est un octet, soit 256 valeurs y compris le zéro pour indiquer une chaine vide (min = 0, max = 255 ce qui fait 256 valeurs).
Le VARCHAR a l'avantage de pouvoir être indexé et de pouvoir être mis à NULL (!!! c'est pas pareil qu'une chaine vide).
L'inconvénient du VARCHAR c'est que sa taille ne peut pas dépasser celle d'un enregistrement (max 65535 octets).
Ceci est encore plus vrai si on multiplie les VARCHAR dans un enregistrement.
12) BOOL et BOOLEAN sont des synonymes
6) Pour les entiers INT, SMALLINT ... ils sont signés, cela veut dire qu'il y a autant de valeurs en négatif qu'en positif. pour un TINYINT (256 valeurs -128 à +127 (avec le zéro ça fait bien 256 valeurs).
3) Oui le CHAR comble avec des blancs, c'est plus simple dans certains cas, un code postal par exemple CHAR(5) on gagne 1 octet par rapport au VARCHAR (voir ici)
Ca serait simple si un caractère valait 1 octet, mais en UTF-8 un caractère peut prendre un à 4 octets
les limites sont en octets mais lorsqu'on précise la taille d'un champ, c'est en nombre de caractères TEXT(100)
En relisant la doc, Oui on peut indexer un champ TEXT à condition de préciser sa taille TEXT(100).
les entrées dans l'index seront calculées en fonction de l'encodage, par exemple 4 x 100 si UTF-8 MB4 (multibyte 4 octets)
ce qui fait beaucoup plus que les données elles-même.
L'enregistrement sur disque se fait par bloc, un bloc peut contenir un ou plusieurs enregistrements, c'est pour cela que les enregistrements ont une taille limitée. La taille dépend du moteur (myisam, innodb ...) voir ici.
Pour les champs pouvant contenir une grande quantité d'information (BLOB, *TEXT) ils sont écrits dans des blocs à part.
5/ Que veut dire "octets" dans ce cas là ? Prenons l'exemple d'un SMALLINT qui est normalement stocké sur 2 octets... ce qui donne 65 535 possbilités. Cela veut dire que si on stocke le chiffre "3"... cela va prendre autant de place que le chiffre "65 533", soit 2 octets dans les 2 cas ?
Exactement, car sinon tu n'as aucun moyen de savoir où finit ton chiffre. Je vais prendre un exemple sur un octet.
3d = 00000011b
Comme c'est sur 8 bits, tu sais que c'est bien 6 "0" devant.
Maintenant imaginons tu peux te dire "bah il suffit de mettre jusqu'au 1 qui est précédé d'un 0
Alors comment tu codes 10 étant donné que 10d = 00001010b
Si on prenait la règle que je viens d'énoncer, tu aurais que 10b, non 1010b, ça vaudrait 2 et plus 10
Donc voilà c'est notemment une des raisons que la taille soit figée, et puis s'il fallait tout le temps regarder le bit d'avant pour savoir si le nombre est fini, ce serait bcp plus long!
Mais sache que c'est pas la seule manière de coder des nombres, il y a aussi le code gray et le bcd (binaire codé décimal), je te laisse google si tu veux plus d'infos
Ex : code gray sur 3 bits :
0d = 000g
1d = 001g
2d = 011g
3d = 010g
4d = 110g
5d = 111g
6d = 101g
7d = 100g
Le but de ce code est de ne changer qu'un bit entre chaque nombre, et jamais celui qui vient de changer et toujours le plus petit possible
Pour le bcd c'est plus simple : un nombre est représenté par ses chiffres codés sous 4 octets :
Ex : 123d = 0001 0010 0011bcd
Pourquoi 4 ? Car le plus grand chiffre est 9d et que 9d en binaire est 1001b
6/ Par rapport à la question précédente, le "65535 possbilités"... cela veut dire que si on souhaite stocker le chiffre "65540", cela ne passera
pas en SMALLINT ? Le "possibilité" correspond au nombre maximal stockable ?
Je vais reprendre un peu la réponse déjà fournie et la compléter
Tout d'abord, en signé 65535 possibilités signifie que tu vas de -32768 à +32767 avec le 0 compris
avec :
32767d = en signé 01111111 11111111b
-32768d = en signé 10000000 00000000b
Ensuite, si tu lui donnes par exemple +32768 (1 de plus que la limite) que vas-t-il faire ?
Ca dépend les langages ! (je ne sais pas pour mysql)
Il y a 2 possibilités :
1) une erreur
2) plus compliqué à comprendre, ce qu'on appelle un dépassement:
Le premier bit est le bit de signe 0 = positif, le reste est la valeur (quand on est en positif !!! en négatif, cela ne fonctionne pas ainsi, il faut faire le complément à 2)
Bon, on va faire une addition binaire pour arriver à notre 32768d = 32767d + 1d = 01111111 11111111b + 1b
Cela suit les mêmes règles d'additions qu'en décimal, donc ça donne 10000000 00000000b et bim, on se retrouve avec un nombre négatif qui vaut la valeur minimale, c'est-à-dire -32768d
C'est-à-dire : les entiers sont cycliques
Bon j'espère avoir répondu à tes 2 questions en profondeur ;) Pour la 6, je te laisse tester sur mysql au moins tu auras l'explication !