Introduction
L'une des principales caractéristiques des bases de données relationnelles en général est la possibilité de définir des schémas ou des structures de table qui spécifient exactement le format des données qu'ils contiendront. Cela se fait en prescrivant les colonnes que ces structures contiennent avec leur type de données et toutes les contraintes.
Les types de données spécifient un modèle général pour les données qu'ils acceptent et stockent. Les valeurs doivent respecter les exigences qu'elles décrivent pour être acceptées par MySQL. Bien qu'il soit possible de définir des exigences personnalisées, les types de données fournissent les blocs de construction de base qui permettent à MySQL de valider les entrées et de travailler avec les données à l'aide des opérations appropriées.
MySQL inclut un large éventail de types de données qui sont utilisés pour étiqueter et valider que les valeurs sont conformes aux types appropriés. Dans ce guide, nous aborderons les types de données les plus courants disponibles dans MySQL, les différents formats d'entrée et de sortie qu'ils utilisent et comment configurer divers champs pour répondre aux besoins de vos applications.
Quels sont les types de données dans MySQL ?
Avant d'entrer dans les détails, examinons les types de données fournis par MySQL.
MySQL prend en charge une gamme raisonnable de types de données adaptés à divers types de données simples et complexes. Ceux-ci incluent :
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
DECIMAL
NUMERIC
FLOAT
DOUBLE
BIT
DATE
DATETIME
TIMESTAMP
TIME
YEAR
CHAR
VARCHAR
BINARY
VARBINARY
BLOB
TEXT
ENUM
SET
GEOMETRY
POINT
LINESTRING
POLYGON
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRYCOLLECTION
JSON
Nous aborderons plus en détail les plus courants d'entre eux tout au long de ce guide.
Démarrer avec les types de données MySQL
Lorsque vous débutez avec les types, il est important de se rappeler que les types seuls ne sont pas toujours une solution complète à la validation des données, mais un composant. D'autres outils de base de données, comme les contraintes, ont également un rôle à jouer dans la définition de l'exactitude. Pourtant, les types de données sont souvent la première ligne de défense contre les données invalides.
Dans de nombreux cas, les types généraux fournis par MySQL conviennent aux types de données que vous allez stocker. Par exemple, bien que vous puissiez stocker les coordonnées d'un point géométrique dans deux colonnes de nombres différentes, le point
fourni type est spécialement conçu pour stocker et valider exactement ce type d'informations. Lors du choix des types, vérifiez que vous utilisez le type le plus spécifique applicable à votre cas d'utilisation.
Nombres et valeurs numériques
MySQL comprend une gamme de types de données numériques adaptés à différents scénarios. Le type approprié dépend de la nature exacte des valeurs que vous prévoyez de stocker ainsi que de vos exigences de précision.
Entiers
L'entier Le type de données est une catégorie de types utilisés pour stocker des nombres sans fractions ni décimales. Celles-ci peuvent être des valeurs positives ou négatives, et différents types d'entiers peuvent stocker différentes plages de nombres. Les types entiers avec des plages de valeurs acceptables plus petites occupent moins d'espace que ceux avec des plages plus larges.
La liste de base des types d'entiers comprend les éléments suivants :
Type entier | Longueur | Plage signée applicable | Plage non signée applicable |
---|---|---|---|
TINYINT | 1 octet | -128 à 127 | 0 à 255 |
SMALLINT | 2 octets | -32768 à 32767 | 0 à 65535 |
MEDIUMINT | 3 octets | -8388608 à 8388607 | 0 à 16777215 |
INT | 4 octets | -2147483648 à 2147483647 | 0 à 4294967295 |
BIGINT | 8 octets | -2^63 à -2^63-1 | 0 à 2^64-1 |
Les types ci-dessus sont limités par leur plage valide. Toute valeur en dehors de la plage entraînera une erreur.
En plus des types mentionnés ci-dessus, MySQL reconnaît également un alias appelé SERIAL
. Marquage d'une colonne comme SERIAL
lui donnera ces propriétés :BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
. Ceci est utilisé comme raccourci pour les propriétés communes des colonnes de clé primaire. La colonne attribuera automatiquement une nouvelle valeur unique chaque fois qu'un enregistrement est ajouté.
Point fixe
Les types à virgule fixe sont utilisés pour contrôler le degré de précision ou spécificité possible pour un nombre avec décimales. Dans MySQL, cela peut être contrôlé en manipulant deux facteurs :la précision et l'échelle.
Précision est le nombre maximal de chiffres totaux qu'un nombre peut avoir. En revanche, échelle est le nombre de chiffres à droite de la virgule décimale. En manipulant ces nombres, vous pouvez contrôler la taille autorisée des composants fractionnaires et non fractionnaires d'un nombre.
Ces deux arguments sont utilisés pour contrôler la précision arbitraire en utilisant le numeric
ou decimal
types de données (ces deux types sont synonymes dans MySQL). Le numeric
type prend de zéro à deux arguments.
Sans argument, la colonne est définie comme ayant une précision de 10 et une échelle de 0. Cela signifie que la colonne peut contenir jusqu'à 10 chiffres, mais aucun d'entre eux ne peut être après la virgule :
NUMERIC
Lorsqu'un seul argument est fourni, il est interprété comme la précision de la colonne avec une échelle définie sur 0. Cela vous permet effectivement de spécifier le nombre maximum de chiffres dans un nombre entier (pas de composants fractionnaires ou décimaux). Par exemple, si vous avez besoin d'un nombre entier à 5 chiffres, vous pouvez spécifier :
NUMERIC(5)
Spécifiez la précision suivie de l'échelle lors de la configuration d'une colonne à l'aide des deux contrôles. MySQL arrondira la composante décimale de toute entrée au nombre correct de chiffres en utilisant le numéro d'échelle. MySQL utilisera la précision et l'échelle pour déterminer le nombre de chiffres autorisés à gauche du point décimal. Si une entrée dépasse le nombre de chiffres autorisé, MySQL produira une erreur.
Par exemple, nous pouvons spécifier une colonne avec une précision totale de 5 et une échelle de 2 :
NUMERIC(5, 2)
Cette colonne aurait le comportement suivant :
Valeur d'entrée | Valeur arrondie | Accepté (conforme à la précision) ? |
---|---|---|
400.28080 | 400.28 | Oui |
8.332799 | 8.33 | Oui |
11799.799 | 11799.80 | Non |
11799 | 11799 | Non |
2802.27 | 2802.27 | Non |
Point flottant
Les nombres à virgule flottante sont une autre façon d'exprimer les nombres décimaux, mais sans précision exacte et cohérente. Au lieu de cela, les types à virgule flottante n'ont qu'un concept de précision maximale qui est souvent lié à l'architecture et à la plate-forme du matériel.
Par exemple, pour limiter une colonne à virgule flottante à 8 chiffres de précision, vous pouvez utiliser le FLOAT
type, qui stocke les résultats en utilisant 4 octets avec une précision comprise entre 0 et 23 chiffres :
FLOAT(8)
De même, le DOUBLE
type utilise 8 octets pour stocker les données et peut utiliser des précisions de 24 à 53 chiffres.
En raison de ces choix de conception, les nombres à virgule flottante peuvent fonctionner efficacement avec des nombres comportant un grand nombre de décimales, mais pas toujours exactement. La représentation interne des nombres peut entraîner de légères différences entre l'entrée et la sortie. Cela peut entraîner un comportement inattendu lors de la comparaison de valeurs, de l'exécution de calculs en virgule flottante ou de l'exécution d'opérations nécessitant des valeurs exactes.
Point flottant vs numérique
Les deux nombres à virgule flottante fournis par des types comme FLOAT
et DOUBLE
et les nombres à virgule fixe fournis par le NUMERIC
ou DECIMAL
les types peuvent être utilisés pour stocker des valeurs décimales. Comment savoir lequel utiliser ?
La règle générale est que si vous avez besoin d'exactitude dans vos calculs, le NUMERIC
le type est toujours le meilleur choix. Le NUMERIC
type stockera les valeurs exactement telles qu'elles sont fournies, ce qui signifie que les résultats sont entièrement prévisibles lors de la récupération ou du calcul sur les valeurs. Le NUMERIC
Le type est appelé précision arbitraire car vous spécifiez le degré de précision requis par le type et il stockera ce nombre exact de chiffres dans le champ.
En revanche, des types comme FLOAT
et DOUBLE
sont des types à précision variable. Le degré de précision qu'ils maintiennent dépend de la valeur d'entrée. Lorsqu'ils atteignent la fin de leur niveau de précision autorisé, ils peuvent arrondir les chiffres restants, ce qui entraîne des différences entre les valeurs soumises et récupérées.
Alors, quand utiliseriez-vous des types à précision variable ? Types de précision variables comme FLOAT
et DOUBLE
sont bien adaptés aux scénarios où les valeurs exactes ne sont pas nécessaires (par exemple, si elles seront de toute façon arrondies) et lorsque la vitesse est très précieuse. La précision variable offrira généralement des avantages en termes de performances par rapport au NUMERIC
saisir.
Types de chaînes
Les types de caractères et les types de chaînes de MySQL peuvent être classés en deux catégories :longueur fixe et longueur variable . Le choix entre ces deux affecte la façon dont MySQL alloue de l'espace pour chaque valeur et comment il valide l'entrée.
Le type de données basé sur des caractères le plus simple dans MySQL est le char
taper. Sans argument, le char
type accepte un seul caractère en entrée :
CHAR
Lorsqu'un entier positif est fourni dans la déclaration, le char
stockera une chaîne de caractères de longueur fixe égale au nombre de caractères spécifié :
CHAR(10)
Si une chaîne est fournie avec moins de caractères, des espaces vides seront ajoutés pour remplir la longueur :
Entrée | Nombre de caractères saisis | Valeur stockée | Nombre de caractères stockés |
---|---|---|---|
'arbre' | 4 | 'arbre ' | 10 |
Si une chaîne est donnée avec un nombre de caractères supérieur au nombre autorisé, MySQL génère une erreur. À titre d'exception à cette règle, si les caractères qui débordent sont tous des espaces, MySQL tronquera simplement les espaces en excès pour tenir dans le champ.
L'alternative aux champs de caractères de longueur fixe sont les champs de longueur variable. Pour cela, MySQL fournit le varchar
taper. Le varchar
type stocke les caractères sans taille fixe. Contrairement à char
, varchar
ne peut pas être utilisé sans spécifier le nombre maximum de caractères à stocker.
En définissant un varchar
avec un entier positif, vous pouvez définir une longueur de chaîne maximale :
VARCHAR(10)
Cela diffère de l'utilisation du char
tapez avec un entier dans ce varchar
ne remplira pas la valeur si l'entrée ne respecte pas la longueur maximale du champ :
Entrée | Nombre de caractères saisis | Valeur stockée | Nombre de caractères stockés |
---|---|---|---|
'arbre' | 4 | 'arbre' | 4 |
Si la chaîne est supérieure à la longueur maximale, MySQL renverra une erreur. Le même comportement de troncature qui est présent dans char
se produit ici :si les caractères qui débordent sont des espaces, ils seront tronqués pour tenir à l'intérieur de la longueur maximale des caractères.
MySQL prend également en charge le binary
et varbinary
Types de données. Ceux-ci fonctionnent de la même manière que le char
et varchar
types, mais stockent des chaînes binaires plutôt que des chaînes de caractères. Cela a des implications sur la façon dont ils sont stockés et exploités (pour des choses comme les comparaisons, le tri, etc.).
Pour binary
et varbinary
types, l'entier donné lors de la définition du type de colonne représente le nombre d'octets au lieu du nombre de caractères.
Deux autres types de données que MySQL fournit pour les chaînes et le stockage de caractères sont blob
et text
. Ces types fonctionnent de manière similaire au varchar
et varbinary
types respectifs et sont destinés au stockage de gros objets. Ils fonctionnent pour la plupart de la même manière que leurs homologues, mais présentent quelques différences, telles que l'impossibilité d'avoir des valeurs par défaut et l'exigence d'une longueur de préfixe lors de la création d'un index.
Booléens
MySQL n'a pas réellement de type booléen natif pour représenter les valeurs vraies et fausses.
MySQL reconnaît les types BOOL
ou BOOLEAN
dans un souci de compatibilité avec d'autres systèmes de bases de données. Son implémentation interne utilise cependant un TINYINT(1)
colonne pour stocker les valeurs et les interprète comme vraies ou fausses en fonction d'un ensemble de règles.
Lors de l'interprétation de valeurs numériques dans un contexte booléen, la valeur de 0
est considéré comme faux. Toutes les valeurs non nulles sont considérées comme vraies.
MySQL reconnaît les littéraux booléens TRUE
et FALSE
et convertit TRUE
à 1 et FALSE
à 0 lors de leur stockage.
Dates et heures
MySQL prend en charge la représentation des dates, des heures et des combinaisons des deux.
Dates
La date
type peut stocker une date sans valeur d'heure associée :
DATE
Lors du traitement de l'entrée pour date
colonnes, MySQL peut interpréter différents formats pour déterminer la date correcte à stocker. Cependant, les composants doivent toujours apparaître dans le même ordre :année, mois, puis jour. Le STR_TO_DATE()
est disponible pour aider à convertir d'autres formats de date dans un format que MySQL interprétera correctement.
Lors de l'affichage des dates, MySQL utilise le YYYY-MM-DD
format. Vous pouvez utiliser le DATE_FORMAT()
fonction pour formater la sortie dans d'autres formats.
La date
type peut stocker des valeurs allant de 1000-01-01
au 9999-12-31
.
Heure
L'time
le type de données peut stocker une heure spécifique de la journée sans fuseau horaire ni date associés.
Lors du traitement de l'entrée pendant time
colonnes, MySQL peut interpréter plusieurs formats pour déterminer l'heure correcte de stockage. Lorsque l'entrée comporte des deux-points, elle est généralement interprétée comme hh:mm:ss
. Toute valeur raccourcie (utilisant une seule colonne) sera interprétée comme utilisant hh:mm
. Lorsque l'entrée ne fait pas ont des deux-points, le temps est traité pour remplir la plus petite valeur en premier. Par exemple, 1045
est pris comme 10 minutes et 45 secondes.
MySQL prend également en charge les secondes fractionnaires si un point décimal est donné. Il stocke jusqu'à 6 chiffres de précision après la décimale. Valeurs en time
les colonnes peuvent aller de -838:59:59.000000
au 838:59:59.000000
.
Lors de l'affichage des valeurs de temps, MySQL utilise le hh:mm:ss
format. Comme pour les dates, une fonction est fournie, appelée TIME_FORMAT()
pour afficher les valeurs de temps en utilisant d'autres formats.
Horodatages et datetime
MySQL peut représenter les horodatages, une combinaison d'une date et d'une heure utilisée pour représenter un moment précis dans le temps, dans deux variantes différentes :en utilisant le timestamp
type et le datetime
saisir.
Le datetime
type peut représenter des valeurs de 1000-01-01 00:00:00
au 9999-12-31 23:59:59
. Il peut également inclure des fractions de seconde jusqu'à six chiffres similaires à l'time
saisir.
L'timestamp
type peut représenter des valeurs de 1970-01-01 00:00:01
UTC à 2038-01-19 03:14:07
UTC. Il peut également gérer les fractions de seconde. Lors du stockage de timestamp
valeurs, toutes les valeurs sont converties du fuseau horaire donné en UTC pour le stockage et reconverties dans le fuseau horaire local lors de la récupération. Le datetime
le type ne le fait pas.
À partir de MySQL 8.0.19, vous pouvez inclure un décalage de fuseau horaire lors du stockage d'un timestamp
pour définir explicitement le fuseau horaire de la valeur stockée. Pour ce faire, incluez une valeur après le composant de temps, sans espace pour indiquer le décalage. La plage de valeurs acceptées va de -14:00
à +14:00
, qui représente le décalage de la valeur stockée par rapport à UTC.
Lorsque vous décidez de stocker ou non les valeurs de date et d'heure à l'aide de datetime
ou timezone
types, il est souvent utile de les séparer en fonction de ce pour quoi ils sont les meilleurs.
Pensez à datetime
valeurs comme une date et une heure spécifiques, en relation avec le calendrier et l'horloge où qu'elles soient récupérées. Si une personne se couche à 23h le soir, un datetime
value peut représenter cette valeur, quel que soit le fuseau horaire dans lequel se trouve actuellement la personne.
D'autre part, timezone
les valeurs sont les meilleures pour représenter un moment spécifique dans le temps qui est sans ambiguïté sur les fuseaux horaires. Pour envoyer une invitation à un appel vidéo, un timezone
serait en mesure de s'assurer que la réunion a lieu à la même heure pour tout le monde, quel que soit le fuseau horaire dans lequel se trouve le participant.
Autres types utiles
En plus des types que nous avons abordés avec une certaine profondeur ci-dessus, il existe d'autres types qui sont utiles dans des scénarios spécifiques. Nous les aborderons brièvement pour vous donner une idée de la façon de les utiliser et quand ils peuvent être utiles.
Types énumérés et définis
Deux types associés qui permettent aux utilisateurs de dicter les valeurs valides pour une colonne sont les enum
et set
type.
L'enum
type est un type de chaîne qui permet à l'utilisateur de définir une collection de valeurs valides lors de la création de la colonne. Toute valeur qui correspond à l'une des valeurs définies est acceptée et toutes les autres valeurs sont rejetées. Cela fonctionne comme un menu déroulant en ce sens qu'un choix peut être fait à partir d'un ensemble spécifique d'options. Par exemple, un enum
appelé season
peut être créé avec les valeurs winter
, spring
, summer
, et autumn
.
Pour créer un enum
colonne, spécifiez le type comme enum
, donnant les valeurs possibles sous forme de chaînes, séparées par des virgules, à l'intérieur d'un ensemble de parenthèses, comme ceci :
season ENUM('winter', 'spring', 'summer', 'autumn')
Un type similaire de type défini par l'utilisateur est le set
taper. Comme le enum
taper, set
Les types permettent aux utilisateurs de spécifier des valeurs valides sous forme de chaînes lors de la définition. La différence entre ces deux types est que dans un set
, plusieurs valeurs peuvent être stockées pour chaque enregistrement.
Par exemple, si vous aviez besoin d'une colonne pour représenter les jours de la semaine où les bénévoles sont disponibles pour travailler, vous pourriez avoir un set
colonne comme celle-ci :
availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')
Lors de la saisie de valeurs pour la availability
colonne que nous venons de créer, vous fournissez une seule chaîne avec des virgules séparant tous les jours où le volontaire est disponible. Par exemple :
'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'
Pour set
types dans MySQL, les valeurs en double dans l'entrée sont toujours supprimées et lors de la récupération, les valeurs suivent l'ordre utilisé dans le set
définition quel que soit l'ordre lors de la saisie dans la colonne.
JSON
MySQL prend en charge les colonnes dans JSON en utilisant le json
taper. Données stockées en tant que json
est stocké en binaire pour une exécution et un traitement plus rapides afin que le serveur n'ait pas à interpréter une chaîne pour fonctionner sur JSON
valeurs.
JSON
Pour fonctionner sur JSON
colonnes, MySQL fournit un certain nombre de fonctions pour travailler avec des valeurs dans le document.
Conclusion
Dans cet article, nous avons couvert un grand nombre des types de données les plus courants qui sont utiles lorsque vous travaillez avec des bases de données MySQL. Il existe d'autres types non couverts dans ce guide qu'il est utile de connaître, mais ceux-ci représentent un bon point de départ pour la plupart des cas d'utilisation.
Il est important d'utiliser le système de type de manière appropriée afin que vous puissiez contrôler les valeurs valides et opérer sur les données comme prévu. Il y a des pièges que vous pouvez rencontrer si vous choisissez un type qui ne convient pas à vos données, donc y réfléchir avant de vous engager sur un type de données vaut la peine dans la plupart des cas.
Si vous utilisez Prisma Client pour travailler avec vos bases de données MySQL, vous pouvez trouver un mappage entre certains des types MySQL et Prisma courants dans la documentation des connecteurs de données MySQL de Prisma.