Heim  >  Artikel  >  Datenbank  >  MySQL Basic Tutorial 4 – Speicheranforderungen von Datentypen und Auswahl des richtigen Typs

MySQL Basic Tutorial 4 – Speicheranforderungen von Datentypen und Auswahl des richtigen Typs

黄舟
黄舟Original
2017-02-24 11:03:151275Durchsuche

1. Speicheranforderungen für Spaltentypen

Listet die Speicheranforderungen jedes von MySQL unterstützten Spaltentyps nach Kategorie auf.

Die maximale Größe einer Zeile in einer MyISAM-Tabelle beträgt 65.534 Bytes. Jede BLOB- und TEXT-Spalte macht davon nur 5 bis 9 Byte aus.

Wenn die MyISAM-Tabelle Spaltentypen mit variabler Länge enthält, ist auch das Datensatzformat variabler Länge. Beim Erstellen einer Tabelle kann MySQL unter bestimmten Bedingungen eine Spalte von einem Typ mit variabler Länge in einen Typ mit fester Länge oder umgekehrt ändern.

Speicheranforderungen für numerische Typen

SMALLINT
列类型 存储需求
TINYINT 1个字节
SMALLINT 2个字节
MEDIUMINT 3个字节
INT, INTEGER 4个字节
BIGINT 8个字节
FLOAT(p) 如果0 <= p <= 24为4个字节, 如果25 <= p <= 53为8个字节
FLOAT 4个字节
DOUBLE [PRECISION], item REAL 8个字节
DECIMAL(M,D), NUMERIC(M,D) 变长;参见下面的讨论
BIT(M) 大约(M+7)/8个字节
Spaltentyp

Speicheranforderungen

TINYINT 1 Byte
2 Bytes
MEDIUMINT 3 Bytes
INT, INTEGER 4 Bytes
BIGINT 8 Bytes
FLOAT(p) Wenn 0 <= p <= 24 ist 4 Bytes, wenn 25 <= p em> <= 53 ist 8 Bytes
FLOAT 4 Bytes
DOUBLE [PRECISION ], Element REAL 8 Bytes
DECIMAL( M,D), NUMERIC( M,D) variable Länge; siehe Diskussion unten
BIT( M) Über (M+7)/8 Bytes
Der Speicher Anforderungen von DECIMAL (und NUMERIC) sind versionenspezifisch:
剩余的 字节
位数 数目
0 0
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4
9 4

Verwenden Sie das Binärformat, um 9 Dezimalzahlen (basierend auf 10) zu konvertieren. Auf 4 Bytes komprimiert, um den DECIMAL-Spaltenwert darzustellen. Die Speicherung der ganzzahligen und gebrochenen Teile jedes Werts wird separat festgelegt. Jedes Vielfache von 9 Ziffern erfordert 4 Bytes, und die „verbleibenden“ Bits benötigen einen Teil der 4 Bytes. Die folgende Tabelle gibt die Speicheranforderungen für überschüssige Bits an:

Remaining
列类型 存储需求
DATE 3个字节
DATETIME 8个字节
TIMESTAMP 4个字节
TIME 3个字节
YEAR 1个字节
Bytes

Anzahl der Ziffern Anzahl
列类型 存储需求
CHAR(M) M个字节,0 <= M <= 255
VARCHAR(M) L+1个字节,其中L <= 且0 <= M <= 65535(参见下面的注释)
BINARY(M) M个字节,0 <= M <= 255
VARBINARY(M) L+1个字节,其中L <= 且0 <= M <= 255
TINYBLOB, TINYTEXT L+1个字节,其中L < 28
BLOB, TEXT L+2个字节,其中L < 216
MEDIUMBLOB, MEDIUMTEXT L+3个字节,其中L < 224
LONGBLOB, LONGTEXT L+4个字节,其中L < 232
ENUM('value1','value2',...) 1或2个字节,取决于枚举值的个数(最多65,535个值)
SET('value1','value2',...) 1、2、3、4或者8个字节,取决于set成员的数目(最多64个成员)
tr> 0 0 1 1 2 1 3 2 42 5 3 6 3 7 4 8 4 9 4 Datums- und Lagerungsanforderungen für Zeittyp table>Speicheranforderungen der Zeichenfolge Typ
Spaltentyp Speicher Anforderungen
DATE 3 Bytes
DATETIME 8 Bytes
TIMESTAMP 4 Bytes
TIME 3 Bytes
JAHR 1 Byte
Spaltentyp Speicheranforderungen
CHAR(M) MBytes, 0 <= M <= 255
VARCHAR(M) L +1 Bytes, wobei L <= M und 0 <= M <= 65535 (siehe Hinweis unten)
BINARY(M) M Bytes, 0 <= M <= 255
VARBINARY(M) L+1 Byte, wobei L <= M und 0 <= M <= 255
TINYBLOB , TINYTEXT L+1 Bytes, davon L <
BLOB, TEXT L+2 Bytes, wobei L < td>
MEDIUMBLOB, MEDIUMTEXT L+3 Bytes, davon L < 24
LONGBLOB, LONGTEXT td> L+4 Bytes, wobei L < 232
ENUM('value1','value2',. ..) 1 oder 2 Bytes, je nach Aufzählungswert Die Anzahl der Werte (bis zu 65.535 Werte)
SET('value1','value2',... ) 1, 2, 3, 4 oder 8 Bytes, abhängig von der Anzahl der Set-Mitglieder ( bis zu 64 Mitglieder)

VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小。例如,VARCHAR(10)列可以容纳最大长度为10的字符串。实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节。对于字符串'abcd',L是4,存储需要5个字节。

对于CHAR、VARCHAR和TEXT类型,前面的表中的值LM应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。例如,要想保存一个TINYTEXT值需要L字符+ 1个字节。

要想计算用于保存具体CHAR、VARCHAR或者TEXT列值的字节数,需要考虑该列使用的字符集。在具体情况中,当使用Unicode时,必须记住所有Unicode字符使用相同的字节数。

注释:VARCHAR列的有效最大长度为65,532字符。

NDBCLUSTER引擎只支持固定宽度的列。这说明MySQL簇中的表中的VARCHAR列的行为如同类型CHAR(不同的是每个记录仍然有一个额外字节空间)。例如,在Cluster表中,声明为VARCHAR(100)的列中的每个记录存储时将占用101个字节,无论实际存储的记录中的字符串的长度为多少。

BLOB和TEXT类需要 1、2、3或者4个字节来记录列值的长度,取决于该类的最大可能的长度。

在NDB Cluster存储引擎中,TEXT和BLOB列的实施是不同的,其中TEXT列中的每个记录由两个单独部分组成。一个是固定大小(256字节),并且实际上保存在原表中。另一个包括超出256字节的任何数据,保存在隐含的表中。第2个表中的记录总是2,000字节长。这说明如果size<= 256,TEXT列的大小为256(其中size表示记录的大小);否则,大小是256 +size+(2000–(size–256)%2000)。

ENUM对象的大小由不同的枚举值的数目确定。枚举用一个字节,可以有255个可能的值。当枚举的值位于256和65,535之间时,用两个字节。

SET对象的大小由不同的set成员的数量确定。如果set大小是N,对象占(N+7)/8个字节,四舍五入到1、2、3、4或者8个字节。SET最多可以有64个成员。

2. 选择正确的数据类型

为了优化存储,在任何情况下均应使用最精确的类型。例如,如果列的值的范围为从1到99999,若使用整数,则MEDIUMINT UNSIGNED是好的类型。在所有可以表示该列值的类型中,该类型使用的存储最少。

用精度为65位十进制数(基于10)对DECIMAL 列进行所有基本计算(+、-、*、/)。

使用双精度操作对DECIMAL值进行计算。如果准确度不是太重要或如果速度为最高优先级,DOUBLE类型即足够了。为了达到高精度,可以转换到保存在BIGINT中的定点类型。这样可以用64位整数进行所有计算,根据需要将结果转换回浮点值。

3. 使用来自其他数据库引擎的列类型

为了使用由其它卖方编写的SQL执行代码,MySQL按照下表所示对列类型进行映射。通过这些映射,可以很容易地从其它数据库引擎将表定义导入到MySQL中:

其它卖方类型 MySQL类型
BOOL, TINYINT
BOOLEAN TINYINT
CHAR VARYING(M) VARCHAR(M)
DEC DECIMAL
FIXED DECIMAL
FLOAT4 FLOAT
FLOAT8 DOUBLE
INT1 TINYINT
INT2 SMALLINT
INT3 MEDIUMINT
INT4 INT
INT8 BIGINT
LONG VARBINARY MEDIUMBLOB
LONG VARCHAR MEDIUMTEXT
LONG MEDIUMTEXT
MIDDLEINT MEDIUMINT
NUMERIC DECIMAL

在创建表时对列类型进行映射,然后原来的类型定义被丢弃。如果你使用其它卖方的类型创建一个表,然后执行DESCRIBE tbl_name语句,MySQL使用等效的MySQL类型来报告表的结构。例如:

mysql> CREATE TABLE t (a BOOL, b FLOAT8, c LONG, d NUMERIC);Query OK, 0 rows affected (0.08 sec)

mysql> DESCRIBE t;+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| a     | tinyint(1)    | YES  |     | NULL    |       |
| b     | double        | YES  |     | NULL    |       |
| c     | mediumtext    | YES  |     | NULL    |       |
| d     | decimal(10,0) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

 以上就是MySQL基础教程4 —— 数据类型之存储需求及如何选择正确的类型的内容,更多相关内容请关注PHP中文网(www.php.cn)!




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