Heim  >  Artikel  >  Datenbank  >  Umfassendes Verständnis der Datentypen in MySQL

Umfassendes Verständnis der Datentypen in MySQL

怪我咯
怪我咯Original
2017-03-30 11:32:431403Durchsuche

1. Char- und Varchar-Typen

Char- und Varchar-Typen sind ähnlich, beide werden zum Speichern von Strings verwendet, aber sie speichern und rufen Strings auf unterschiedliche Weise ab. char gehört zum Zeichentyp mit fester Länge und varchar zum Zeichentyp mit variabler Länge. Beispiel: Für die beiden Typdefinitionen von char(4) und varchar(4):

(1), '' belegt 4 Bytes in char(4), varchar(4) belegt nur ein Byte in Länge;

(2), 'ab' belegt 4 Bytes in char(4) und nur 3 Bytes in varchar(4) Länge;

(3), 'abcd' belegt 4 Bytes in char(4) und 5 Bytes in varchar(4);

Warum gibt es eine zusätzliche Bytelänge im Varchar-Typ? Dies liegt daran, dass der Varchar-Typ das zusätzliche Byte verwendet, um die tatsächliche Länge des Varchar-Typs zu speichern. Der Abruf von char(4) und varchar(4) ist nicht immer gleich, zum Beispiel:

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)


Da char eine feste Länge hat, wird es schneller verarbeitet als varchar Es gibt Viele davon haben jedoch den Nachteil, dass Speicherplatz verschwendet wird und das Programm nachfolgende Leerzeichen verarbeiten muss. Daher kann die Verwendung des char-Typs zum Speichern von Daten in Betracht gezogen werden, deren Länge sich nicht wesentlich ändert und die hohe Anforderungen an die Abfragegeschwindigkeit stellen. Mit der kontinuierlichen Aktualisierung der MySQL-Version wird sich auch die Leistung des Datentyps varcharDatentyp weiter verbessern und der Anwendungsbereich des Typs varchar wird breiter.

In MySQL haben verschiedene Speicher-Engines unterschiedliche Verwendungsprinzipien für char und varchar:

(1) In der MyISAM-Speicher-Engine wird empfohlen, Feldtypen mit fester Länge anstelle von Variablen zu verwenden Feldtyp mit variabler Länge.
(2). In der Speicher-Engine werden derzeit Datenzeilen mit fester Länge gespeichert. Unabhängig davon, ob es sich um den Typ char oder varchar handelt, werden sie zur Verarbeitung in den Typ char konvertiert.
(3). In der InnoDB-Speicher-Engine wird die Verwendung des Typs varchar empfohlen.

2. TEXT und BLOB

Wenn Sie eine kleine Menge an Zeichenfolgen speichern, können Sie die Datentypen char und varchar verwenden. Wenn Sie größeren Text speichern, entscheiden Sie sich normalerweise für die Verwendung von Text oder BLOB. Der Hauptunterschied zwischen den beiden besteht darin, dass BLOB zum Speichern von Binärdaten wie Fotos verwendet werden kann, während Text nur zum Speichern von Daten vom Typ Zeichen verwendet werden kann. Text und BLOB umfassen drei verschiedene Typen: Text, Mediumtext, Longtext bzw. Blob, Mediumblob und Longblob. Der Hauptunterschied zwischen ihnen besteht in der Länge des gespeicherten Textes und den gespeicherten Bytes.

Einige Probleme, die bei der Verwendung von BLOB- und TEXT-Typen beachtet werden sollten:

(1), BLOB und TEXT verursachen einige Leistungsprobleme, insbesondere wenn eine große Anzahl von Löschvorgängen ausgeführt wird . Der Löschvorgang hinterlässt große „Lücken“ in der Datentabelle. Das zukünftige Ausfüllen dieser „Lücken“ hat Auswirkungen auf die Einfügeleistung. Um die Leistung zu verbessern, sollten Sie solche Tabellen regelmäßig mit der Funktion OPTIMIZETABLE defragmentieren, um Lücken zu vermeiden, die zu Leistungsproblemen führen.

(2). Verwenden Sie synthetische Indizes, um die Abfrageleistung für große Textfelder zu verbessern. Der sogenannte synthetische Index besteht darin, einen Hash-Wert basierend auf dem Inhalt des großen Textfelds zu erstellen und diesen Wert in einer separaten Datenspalte zu speichern. Anschließend kann die Datenzeile über den Hash-Wert gefunden werden. Beispiel:

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)


Synthetische Indizes können nur in Szenarien mit exakter Übereinstimmung verwendet werden, wodurch die Festplatten-E/A bis zu einem gewissen Grad reduziert und die Abfrageeffizienz verbessert wird. Wenn Sie Fuzzy-Abfragen für BLOB- und CLOB-Felder durchführen müssen, können Sie den Präfixindex von MySQL verwenden, d. h. einen Index für die ersten n Spalten des Felds erstellen. Zum Beispiel:

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). Rufen Sie nicht unnötig große BLOB- oder TEXT-Felder ab.

(4). Trennen Sie BLOB- oder TEXT-Felder in separate Tabellen.

3. Gleitkommazahlen und Festkommazahlen

Gleitkommazahlen werden im Allgemeinen zur Darstellung von Werten verwendet, die Dezimalteile enthalten. Wenn ein Feld als Gleitkommatyp definiert ist und die Genauigkeit der eingefügten Daten die tatsächlich in der Spalte definierte Genauigkeit überschreitet, wird der eingefügte Wert auf die tatsächlich definierte Genauigkeit gerundet Geben Sie ihn dann ein, und der Rundungsprozess meldet keinen Fehler. Float und Double (Real) werden in MySQL zur Darstellung von Gleitkommazahlen verwendet.

Festkommazahlen unterscheiden sich von Gleitkommazahlen. Festkommazahlen werden tatsächlich in Form von Zeichenfolgen gespeichert, sodass Festkommazahlen Daten genauer speichern können. Wenn die Genauigkeit der eingefügten Daten größer ist als die tatsächlich definierte Genauigkeit, gibt MySQL eine Warnung aus, aber die Daten werden vor dem Einfügen entsprechend der tatsächlichen Genauigkeit gerundet (wenn sie im herkömmlichen Modus eingefügt werden, wird ein Fehler gemeldet). . In MySQL werden Dezimalzahlen (oder Zahlen) zur Darstellung von Festkommazahlen verwendet.

Die Verwendung von Gleitkommazahlen zum Speichern von Daten führt zu Fehlern. In Szenarien mit hohen Genauigkeitsanforderungen (z. B. Währung) sollten Festkommazahlen zum Speichern von Daten verwendet werden. Zum Beispiel:

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类型。


Das obige ist der detaillierte Inhalt vonUmfassendes Verständnis der Datentypen in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn