Maison  >  Article  >  base de données  >  Compréhension complète des types de données dans MySQL

Compréhension complète des types de données dans MySQL

怪我咯
怪我咯original
2017-03-30 11:32:431403parcourir

1. Types Char et varchar

Les types Char et varchar sont similaires, les deux sont utilisés pour stocker des chaînes, mais ils enregistrent et récupèrent des chaînes de différentes manières. char appartient au type de caractère de longueur fixe et varchar appartient au type de caractère de longueur variable. Par exemple : pour les deux définitions de type char(4) et varchar(4) :

(1), '' occupe 4 octets dans char(4), varchar(4) Il n'occupe qu'un octet dans length;

(2), 'ab' occupe 4 octets dans char(4), et seulement 3 octets dans varchar(4) Longueur

(3), 'abcd' occupe 4 octets dans char(4) et 5 octets dans varchar(4);

Pourquoi y a-t-il une longueur d'octet supplémentaire dans le type varchar ? En effet, le type varchar utilise l'octet supplémentaire pour stocker la longueur réelle du type varchar. La récupération de char(4) et varchar(4) n'est pas toujours la même, par exemple :

mysql> create table char_and_varchar (v varchar(4),c char(4));
Query OK, 0 rows affected (0.20 sec)

mysql> insert into char_and_varchar values ('ab  ','ab  ');
Query OK, 1 row affected (0.33 sec)

mysql> select concat(v,'cd'),concat(c,'cd') from char_and_varchar;
+----------------+----------------+
| concat(v,'cd') | concat(c,'cd') |
+----------------+----------------+
| ab  cd         | abcd           |
+----------------+----------------+
1 row in set (0.35 sec)


Puisque char est de longueur fixe, il est traité plus rapidement que varchar. beaucoup, mais ses inconvénients sont un gaspillage d'espace de stockage et le programme doit traiter les espaces de fin. Par conséquent, les données dont la longueur ne change pas beaucoup et qui ont des exigences élevées en matière de vitesse de requête peuvent être envisagées pour utiliser le type char pour stocker. Avec la mise à niveau continue de la version MySQL, les performances du type de données varchar continueront également de s'améliorer et la gamme d'applications du type varchar sera plus large.

Dans MySQL, différents moteurs de stockage ont des principes d'utilisation différents pour char et varchar :

(1) Dans le moteur de stockage MyISAM, il est recommandé d'utiliser des types de champs de longueur fixe au lieu de Variable. type de champ de longueur.
(2). Dans le moteur de stockage mémoire, les lignes de données de longueur fixe sont actuellement stockées, donc qu'elles soient de type char ou varchar, elles seront converties en type char pour le traitement.
(3). Dans le moteur de stockage InnoDB, il est recommandé d'utiliser le type varchar.

2. TEXT et BLOB

Lors de l'enregistrement d'une petite quantité de chaînes, vous pouvez utiliser les types de données char et varchar. Lorsque vous enregistrez un texte plus volumineux, vous choisissez généralement d'utiliser du texte ou un BLOB. La principale différence entre les deux est que BLOB peut être utilisé pour enregistrer des données binaires, telles que des photos, tandis que le texte ne peut être utilisé que pour enregistrer des données de type caractère. Text et BLOB incluent trois types différents : text, mediumtext, longtext et blob, mediumblob et longblob respectivement. La principale différence entre eux réside dans la longueur du texte stocké et les octets stockés.

Quelques problèmes auxquels il convient de prêter attention lors de l'utilisation des types BLOB et TEXT :

(1), BLOB et TEXT entraîneront des problèmes de performances, en particulier lorsqu'un grand nombre d'opérations de suppression sont effectuées . L'opération de suppression laissera de grands "trous" dans la table de données. Le fait de remplir ces "trous" d'enregistrements à l'avenir aura un impact sur les performances d'insertion. Afin d'améliorer les performances, vous devez utiliser régulièrement la fonction OPTIMIZETABLE pour défragmenter ces tables afin d'éviter des trous provoquant des problèmes de performances.

(2). Utilisez des index synthétiques pour améliorer les performances des requêtes pour les grands champs de texte. L'index dit synthétique consiste à créer une valeur de hachage basée sur le contenu du grand champ de texte et à stocker cette valeur dans une colonne de données distincte. La ligne de données peut ensuite être trouvée via la valeur de hachage. Par exemple :

mysql> create table t (id varchar(100),content blob,hash_value varchar(40));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t values (1,repeat('beijing',2),md5(content)); 
Query OK, 1 row affected (0.33 sec)

mysql> insert into t values (2,repeat('beijing',2),md5(content)); 
Query OK, 1 row affected (0.01 sec)

mysql> insert into t values (2,repeat('beijing 2008',2),md5(content));
Query OK, 1 row affected (0.01 sec)

mysql> select * from t;
+------+--------------------------+----------------------------------+
| id   | content                  | hash_value                       |
+------+--------------------------+----------------------------------+
| 1    | beijingbeijing           | 09746eef633dbbccb7997dfd795cff17 |
| 2    | beijingbeijing           | 09746eef633dbbccb7997dfd795cff17 |
| 2    | beijing 2008beijing 2008 | 1c0ddb82cca9ed63e1cacbddd3f74082 |
+------+--------------------------+----------------------------------+
3 rows in set (0.00 sec)

mysql> select * from t where hash_value=md5(repeat('beijing 2008',2));
+------+--------------------------+----------------------------------+
| id   | content                  | hash_value                       |
+------+--------------------------+----------------------------------+
| 2    | beijing 2008beijing 2008 | 1c0ddb82cca9ed63e1cacbddd3f74082 |
+------+--------------------------+----------------------------------+
1 row in set (0.00 sec)


L'index synthétique ne peut être utilisé que dans des scénarios de correspondance exacte, ce qui réduit les E/S disque dans une certaine mesure et améliore l'efficacité des requêtes. Si vous devez effectuer des requêtes floues sur les champs BLOB et CLOB, vous pouvez utiliser l'index de préfixe de MySQL, c'est-à-dire créer un index pour les n premières colonnes du champ. Par exemple :

mysql> create index idx_blob on t (content(100));
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from t \G
*************************** 1. row ***************************
        Table: t
   Non_unique: 1
     Key_name: idx_blob
 Seq_in_index: 1
  Column_name: content
    Collation: A
  Cardinality: 3
     Sub_part: 100
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)

mysql> desc select * from t where content like 'beijing%' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t
         type: ALL
possible_keys: idx_blob
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3
        Extra: Using where
1 row in set (0.00 sec)

(3). Ne récupérez pas inutilement des champs BLOB ou TEXT volumineux.

(4). Séparez les champs BLOB ou TEXT dans des tableaux séparés.

3. Nombres à virgule flottante et nombres à virgule fixe

Les nombres à virgule flottante sont généralement utilisés pour représenter des valeurs contenant des parties décimales. Lorsqu'un champ est défini comme type à virgule flottante, si la précision des données insérées dépasse la précision réelle définie dans la colonne, la valeur insérée sera arrondie à la valeur de précision réellement définie. Insérez ensuite et le processus d'arrondi ne signalera pas d'erreur. Float et double (real) dans MySQL sont utilisés pour représenter des nombres à virgule flottante.

Les nombres à virgule fixe sont différents des nombres à virgule flottante. Les nombres à virgule fixe sont en fait stockés sous forme de chaînes, de sorte que les nombres à virgule fixe peuvent stocker les données avec plus de précision. Si la précision des données insérées est supérieure à la précision réellement définie, MySQL émettra un avertissement, mais les données seront arrondies en fonction de la précision réelle avant d'être insérées (si elles sont insérées en mode traditionnel, une erreur sera signalée) . Dans MySQL, le nombre décimal (ou numérique) est utilisé pour représenter les nombres à virgule fixe.

L'utilisation de nombres à virgule flottante pour stocker des données entraînera des erreurs. Dans les scénarios nécessitant une grande précision (comme la devise), des nombres à virgule fixe doivent être utilisés pour stocker les données. Par exemple :

mysql> create table b (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.37 sec)

mysql> insert into b values (131072.32,131072.32);
Query OK, 1 row affected (0.00 sec)

mysql> select * from b;
+-----------+-----------+
| c1        | c2        |
+-----------+-----------+
| 131072.31 | 131072.32 |
+-----------+-----------+
1 row in set (0.00 sec)

四、日期类型

MySQL提供的常用的日期类型有:date、time、datetime、timestamp,日期类型的选用原则:

(1)、应根据实际需要选择能够满足应用的最小存储的日期类型;

(2)、如果要记录年月日时分秒,且年代比较久远,最好使用datetime类型;

(3)、如果记录的日期要被多时区的用户所使用,那么最好使用timestamp类型。


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn