Introduction aux types de données dans SQL
Contrairement à JavaScript, SQL a un typage fort. Dans chaque table, chaque colonne a son propre type de données fixe.
Il existe de nombreux types de données, mais contrairement au langage Java, il y en a tellement non pas parce qu'il existe des types de données pour toutes les occasions. Les bases de données dépendent fortement de la taille des données, de sorte que de nombreux types de données ne diffèrent les uns des autres que par leur longueur.
Au total, les types de données peuvent être divisés en 5 groupes :
- Types numériques
- Types de chaîne
- Types de stockage des dates et des heures
- Objets : généralement représentés par une collection d'octets
- Transport : JSON et XML
Généralement, différents SGBD ont toujours leurs propres types de données. Chaque SGBD a sa propre spécialisation, donc l'ajout de nouveaux types de données est une chose très courante.
Une autre chose est que le simple fait d'ajouter un nouveau type de données ne suffit pas, vous devez ajouter des fonctions qui fonctionneront avec lui, ainsi que rendre ce travail pratique et rapide.
Si vous travaillez sur un SGBD industriel (d'entreprise), vous devrez très probablement gérer ses types de données et ses fonctions. Pour quoi il faudra lire 2 à 5 bons livres.
Dans le cadre de notre connaissance de SQL, nous considérerons trois groupes principaux de types de données :
- Nombres
- Cordes
- Rendez-vous
Types numériques en SQL
En SQL, les types numériques sont divisés en trois groupes :
- Types entiers
- Nombres à virgule fixe (nombre fixe de décimales)
- Nombres à virgule flottante
Commençons par les entiers . Il n'y en a que 5, et ils peuvent être décrits dans un seul tableau :
# | Tapez le nom | Longueur en octets | Analogique de Java | Valeur minimum | Valeur maximum |
---|---|---|---|---|---|
1 | TINYINT | 1 | octet | -128 | 127 |
2 | PETITINT | 2 | court | -32.768 | 32.767 |
3 | MENTHE MOYENNE | 3 | -8 388 608 | 8 388 607 | |
4 | INT | 4 | entier | -2 147 483 648 | 2 147 483 647 |
5 | BIGINT | 8 | long | -2 63 | 2 63-1 |
Les types de données sont très similaires aux types de données Java, mais il existe également un type entier de trois octets. Ceci est fait pour économiser sur la taille.
Viennent ensuite les types à virgule flottante , tout comme en Java, il n'y en a que deux :
# | Tapez le nom | Longueur en octets | Analogique de Java | Valeur minimum | Valeur maximum |
---|---|---|---|---|---|
1 | FLOTTER | 4 | flotter | -3.40E+38 | +1.18E+38 |
2 | DOUBLE | 8 | double | -1.79E+308 | +1.79E+308 |
Encore une fois, rien de nouveau. Tout est comme en Java. Cependant, contrairement à Java, SQL a un autre type spécial, le nombre réel à virgule fixe. Il s'appelle DÉCIMAL.
Généralement, ce type est utilisé pour stocker des sommes d'argent. Lorsque le nom de ce type est écrit, il est généralement indiqué après combien de décimales le nombre a avant et après la virgule. Le format général ressemble à ceci :
DECIMAL(total_characters, after_comma)
Et un petit exemple :
salary DECIMAL(5,2)
C'est ainsi que nous avons décrit le fait que la colonne salaire peut contenir des entiers (maximum 3 décimales) et une partie fractionnaire - 2 décimales.
Le nombre maximal de caractères pris en charge par le type DECIMAL est de 65.
Types de chaîne en SQL
Les lignes d'une base de données peuvent être stockées sous deux formes :
- Chaînes de longueur fixe
- Cordes de longueur variable
Les chaînes de longueur fixe sont spécifiées comme CHAR :
CHAR(length)
La longueur fixe signifie que toutes les valeurs de cette colonne contiendront un nombre strictement fixe de caractères.
Exemple de chaîne de longueur fixe :
country_code CHAR(2)
Les chaînes de longueur variable sont spécifiées par le type VARCHAR :
VARCHAR(max_length)
La longueur variable signifie que toutes les valeurs de cette colonne contiendront du texte de n'importe quelle longueur, mais pas plus que la longueur maximale.
Exemple de chaîne de longueur variable :
phone VARCHAR(12)
Les cordes de longueur fixe ont un très gros avantage. Si le client a demandé au serveur SQL de lui renvoyer la 1 000 000e ligne de la table et que les lignes de la table sont de longueur fixe, alors, connaissant la longueur de la ligne, vous pouvez facilement calculer les octets qui se rapportent au souhaité ligne.
Dans le cas d'une longueur de lignes variable, il ne sera pas possible de trouver rapidement la ligne souhaitée dans le tableau. Rappelez-vous la vitesse d'accès à ArrayList et LinkedList, la situation est à peu près la même ici.
Comparons comment des chaînes de différentes longueurs seront stockées dans une table, selon le type de données.
Doubler | CHAR(4) | Octet à stocker | VARCHAR(4) | Octet à stocker | |
---|---|---|---|---|---|
'' | ' ' | 4 | '' | 1 | |
'un B' | 'un B' | 4 | 'un B' | 3 | |
'a B c d' | 'a B c d' | 4 | 'a B c d' | 5 | |
'abcdefgh' | 'a B c d' | 4 | 'a B c d' | 5 |
Note. Le type VARCHAR nécessite un octet de plus pour la même longueur, car il doit en plus stocker la longueur de la chaîne.
Types temporaires en SQL
SQL a également des types spéciaux pour stocker les dates et les heures. Il existe cinq types au total :
# | Tapez le nom | Analogique de l'API Java DateTime | Exemple | Valeur minimum | Valeur maximum |
---|---|---|---|---|---|
1 | DATE | DateLocale | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2 | TEMPS | Heure locale | 'hh:mm:ss[.fraction]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | DATEHEURE | DateHeureLocale | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | HORODATAGE | Date | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | ANNÉE | 1901 | 2155 |
Toutes les données des requêtes sont écrites sous forme de chaîne - entre guillemets simples. Le format d'entrée va du plus grand au plus petit :
- Année
- Mois
- Jour
- Heure
- Minute
- Deuxième
- Fractions de seconde
Les types DATE, TIME et DATETIME peuvent être classiquement considérés comme des analogues des types de l'API Java DateTme : LocalDate, LocalTime, LocalDateTime. La logique est à peu près la même.
Le type TIMESTAMP stocke les données en millisecondes depuis le début de 1970 (une norme du système d'exploitation UNIX). C'est sous cette forme qu'elles sont stockées par le type Date du langage Java.
Et enfin, il y a le type YEAR, qui fait 1 octet de long et stocke des valeurs de 1 à 255. Par conséquent, la plage d'années à sa disposition est 1901-2155. L'année 1900 ne peut pas être stockée par ce type, puisque la valeur 0 est utilisée pour encoder une valeur NULL.
Stocker des objets en SQL
Il existe des types spéciaux pour stocker des objets ou des textes de grande longueur. Nous n’entrerons pas dans les détails à leur sujet, mais je vais quand même les énumérer :
# | Tapez le nom | Explication |
---|---|---|
1 | TEXTE | Utilisé pour stocker de longs textes. Lors de la comparaison et du tri sur ce champ, seuls les 100 premiers caractères sont utilisés. |
2 | GOUTTE | Le nom signifie Byte Large Object. Stocké comme une simple collection d'octets. Peut être utilisé, par exemple, pour stocker des images dans une base de données. |
3 | CLOB | Le nom signifie Char Large Object. Utilisé pour stocker de longs textes. |
4 | ENUM | Vous permet de définir un ensemble fixe de valeurs et de stocker l'une d'entre elles en tant que valeur. |
5 | ENSEMBLE | Vous permet de définir un ensemble fixe de valeurs et de stocker n'importe quel sous-ensemble d'entre elles en tant que valeur. Les stocke généralement sous forme de masque binaire. |
Théoriquement, vous pouvez sérialiser n'importe quel objet Java en tant qu'ensemble d'octets et le stocker dans la base de données en tant que BLOB. La sauvegarde de l'objet n'est pas un problème. Comment continuer à travailler avec lui ?
Supposons qu'une table stocke un million d'objets sous forme sérialisée - comment allez-vous les parcourir ? Un SGBD ne prend en charge qu'un certain type de données lorsqu'il fournit un ensemble complet de fonctions pour l'utiliser.