MySQL基础教程4 — 数据类型之存储需求及如何选择正确的类型
技术百科
黄舟
发布时间:2017-02-24
浏览: 次 1. 列类型存储需求
根据类别列出了mysql支持的每个列类型的存储需求。
MyISAM表中行的最大大小为65,534字节。每个BLOB和TEXT列 账户只占其中的5至9个字节。
如果MyISAM表包括变长列类型,记录格式也是可变长度。当创建表时,在某些条件下,MySQL可以将一个列从变长类型改为固定长度的类型或反之亦然。
数值类型存储需求
| 列类型 | 存储需求 |
| TINYINT | 1个字节 |
| SMALLINT | 2个字节 |
| MEDIUMINT | 3个字节 |
| INT, INTEGER | 4个字节 |
| BIGINT | 8个字节 |
| FLOAT(p) | 如果0 p p |
| FLOAT | 4个字节 |
| DOUBLE [PRECISION], item REAL | 8个字节 |
| DECIMAL(M,D), NUMERIC(M,D) | 变长;参见下面的讨论 |
| BIT(M) | 大约(M+7)/8个字节 |
DECIMAL(和NUMERIC)的存储需求与具体版本有关:
使用二进制格式将9个十进制(基于10)数压缩为4个字节来表示DECIMAL列值。每个值的整数和分数部分的存储分别确定。每个9位数的倍数需要4个字节,并且“剩余的”位需要4个字节的一部分。下表给出了超出位数的存储需求:
| 剩余的 | 字节 |
| 位数 | 数目 |
| 0 | 0 |
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | 3 |
| 6 | 3 |
| 7 | 4 |
| 8 | 4 |
| 9 | 4 |
日期和时间类型的存储需求
| 列类型 | 存储需求 |
| DATE | 3个字节 |
| DATETIME | 8个字节 |
| TIMESTAMP | 4个字节 |
| TIME | 3个字节 |
| YEAR | 1个字节 |
字符串类型的存储需求
| 列类型 | 存储需求 |
| CHAR(M) | M个字节,0 M |
| VARCHAR(M) | L+1个字节,其中L M 且0 M |
| BINARY(M) | M个字节,0 M |
| VARBINARY(M) | L+1个字节,其中L M 且0 M |
| TINYBLOB, TINYTEXT | L+1个字节,其中L 8 |
| BLOB, TEXT | L+2个字节,其中L 16 |
| MEDIUMBLOB, MEDIUMTEXT | L+3个字节,其中L 24 |
| LONGBLOB, LONGTEXT | L+4个字节,其中L 32 |
| ENUM('value1','value2',...) | 1或2个字节,取决于枚举值的个数(最多65,535个值) |
| SET('value1','value2',...) | 1、2、3、4或者8个字节,取决于set成员的数目(最多64个成员) |
VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小。例如,VARCHAR(10)列可以容纳最大长度为10的字符串。实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节。对于字符串'abcd',L是4,存储需要5个字节。
对于CHAR、VARCHAR和TEXT类型,前面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。例如,要想保存一个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字节长。这说明如果sizesize表示记录的大小);否则,大小是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.)!
# 的是
# 出了
# 如果你
# 相关内容
# 最多
# 要想
# mysql
# 浮点
# 变长
# 长度为
# 下表
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python函数缓存机制_lru_cache解析【
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Windows任务计划服务异常原因_任务调度失败的
- Win11搜索栏无法输入_解决Win11开始菜单搜
- 如何使用Golang搭建Web开发环境_快速启动H
- Win11视频默认播放器怎么改_Win11关联第三
- windows如何备份注册表_windows导出和
- php修改数据怎么改富文本_update更新htm
- C++如何使用std::async进行异步编程?(
- 如何在Golang中编写异步函数测试_Golang
- Windows10蓝屏代码DPC_WATCHDOG
- 如何使用Golang操作指针变量_Golang解引
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- Windows10如何更改桌面背景_Win10个性
- 如何使用Golang管理模块版本_Golanggo
- Python字符串操作教程_切片拼接与格式化详解
- SAX解析器是什么,它与DOM在处理大型XML文件
- Windows怎样关闭锁屏广告_Windows关闭
- php后缀怎么变mp4能播放_让php伪装mp4正
- Win11怎么看电池循环次数_Win11笔记本电池
- php在Linux怎么部署_LNMP环境搭建PHP
- Win11怎样安装剪映专业版_Win11安装剪映教
- Go 中 := 短变量声明的类型推导机制详解
- MySQL 中使用 IF 和 CASE 实现查询字
- 零基础学会Python自动化办公_高效处理Exce
- Python集合操作技巧_高效去重解析【教程】
- Win11怎么关闭定位服务 Win11禁止应用获取
- Win11怎么硬盘分区 Win11新建磁盘分区详细
- Python函数接口稳定性_版本演进解析【指导】
- Win11怎么关闭小组件_Win11禁用任务栏天气
- VSC怎样在VSC中调试PHPAPI_接口调试技巧
- 如何在Golang中处理通道发送接收错误_防止阻塞
- Win11怎么开启远程桌面连接_Windows11
- Windows怎样拦截QQ浏览器广告_Window
- C++如何使用std::optional?(处理可
- Win11怎么开启游戏模式_Windows11优化
- c++如何实现一个高性能的环形队列(Ring Bu
- 如何使用Golang实现路由参数绑定_使用Mux和
- Win11怎么设置声音输出设备_Windows11
- 电脑的“网络和共享中心”去哪了_Windows 1
- PyTorch DDP 多进程训练在 Kaggle
- Win11怎么关闭搜索历史_Win11清除设备上的
- Win11怎么设置默认邮件客户端 Win11修改M
- Win10怎么创建桌面快捷方式 Win10为应用创
- Windows10系统怎么查看IP地址_Win10
- Win11开始菜单打不开_修复Windows 11
- Win10如何更改电脑休眠时间_Windows10
- Win11怎么关闭系统声音_Win11系统提示音静
- 短链接怎么用php递归还原_多层加密链接的处理法【
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余

QQ客服