mysql 人名用什么类型_如何选择合适的MySQL数据类型

一、MySQL数据类型选择原则

更小的通常更好:一般情况下选择可以正确存储数据的最小数据类型。越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小。

简单就好:简单的数据类型的操作通常需要更少的CPU周期。例如:整型比字符操作代价要小得多,因为字符集和校对规则(排序规则)使字符比整型比较更加复杂。

尽量避免NULL:尽量制定列为NOT NULL,除非真的需要NULL类型的值。因为可能为NULL列使得索引,索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。

二、选择具体数据类型

在选择列的数据类型时需要先选定合适的大类型,如:数字,字符串,时间等。

(1)、整数类型

数据类型

长度/字节

范围

TINYINT

1

-2^7—2^7-1

SMALLINT

2

-2^15—2^15-1

MEDIUMINT

3

-2^23—2^23-1

INT

4

-2^31—2^31-1

BIGINT

8

-2^64—2^64-1

区分开TINYINT / INT / BIGINT,能确定不会使用负数的字段,建议添加 unsigned定义。

能够用数字类型的字段尽量选择数字类型而不用字符串类型。

(2)、实数类型

实数是带有小数部分的数字。然而它们不只是存储小数部分;也可以是DECIMAL存储比BIGINT还大的整数。MYSQL即支持精确类型,也支持非精确存储。FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算。具体计算规则取决于所使用平台的实现。

数据类型

长度/字节

范围

FLOAT

4

DOUBLE

8

DECIMAL

最多65数字(5.0以上版本)

MySQL使用DOUBLE作为内部浮点计算的类型。注意,DECIMAL需要额外的空间和计算开销,所以只要要求尽量对小数进行精确时才使用DECIMAL,例如在存储财务数据时,可以用BIGINT来替代它来实现,只需要将数据乘以相应的倍数即可。

FLOAT和DOUBLE选择(尽量选择FLOAT)

如何有涉及到运算,用float和double可能会精度不准,可以考虑将小数乘于相应的倍数,然后用BIGINT来存储。

(3)、字符串类型

MySQL支持多种字符串类型。从4.1版本开始,每个字符串列可以定义自己的字符集和校对规则(排序规则),这些东西会在很大程度上影响性能。

1、VARCHAR和CHAR类型

VARCHAR和CHAR时最主要的两种字符串类型。

VARCHAR:适用于存储变长的字符串,是最常见的字符串数据类型。它比定长更加节省空间,因为它仅需要使用必要的额外空间(如果MySQL表使用ROW_FORMAT=FIXED创建的话,会使用定长)。

适合使用该类型的情况:字符串列的最大长度比平均长度大很多;列的更新很少,所以碎片不是问题;使用了UTF-8这样复杂的字符集,每个字符的使用不同字节数进行存储。

注:5.0以上版本会保留末尾空格,更早的版本会删除末尾空格。InnoDB存储引擎会把过长的VARCHAR转换为BLOB类型。

CHAR:CHAR是定长字符串类型,MySQL总是根据定义的类型进行分配足够的空间。当存储CHAR时MySQL会默认删除行尾空格。因为CHAR值通常需要用空格进行填充以方便比较。

CHAR适合存储很短的字符串,或者所有长度都接近一个长度。

对于经常变更的数据CHAR比较VARCHAR要好,因为定长的CHAR类型不容易产生碎片。

对于更短的列CHAR比VARCHAR要更加节省空间,因为VARCHAR总是需要一个额外的字节来存储长度。

2、BLOB和TEXT类型

BLOB和TEXT是用来存储很大的数据来设计的字符串数据类型,分别采用二进制和字符方式进行存储。

实际上他们时属于两种不同数据类型家族:字符类型的时TINYTEXT, SMALLTEXT, TEXT, MEDIUMTEXT, LONGTEXT;对应的二进制类型是TINYBLOB, SMALLBLOB, BLOB, MEDIUMBLOB, LONGBLOB。

BLOB和TEXT的仅有的区别在于BLOB类型存储的时二进制数据,没有排序规则或字符集,而TEXT类型有字符集和排序规则。

char,varchar,TEXT的选择:非万不得已不要使用 TEXT 数据类型,定长字段,建议使用 CHAR 类型(填空格),不定长字段尽量使用 VARCHAR(自动适应长度,超过阶段),且仅仅设定适当的最大长度。

(4)、日期和时间类型

MySQL可以使用很多类型来保存日期和时间值,例如YEAR和DATE.MySQL能存储最小粒度为秒。但是可以使用微秒级的力度进行运算。

1、DATETIME

能保存1001到9999年,精度为秒。格式为YYYY-MM-DD HH:MM:SS与时区无关,使用八个字节的存储空间。

2、TIMESTAMP

时间戳,正如名字一样。它能保存从1970年1月1号午夜(格林尼治标准时间)。它只使用四个字节的存储空间只能表示1970到2038年。

TIMESTAMP显示的值依赖于时区。MYSQL服务器,操作系统,以及客户端连接都有时区设置。因此存储值为0时在不同的时区显示值会有差别。

注:通常情况下应尽量使用TIMESTAMP,因为它比DATETIME效率更高。如果需要存储更小粒度的时间,可以用BIGINGT或者转换成DOUBLE类型来进行存储。

(5)、ENUM数据类型

枚举数据类型在内存中非常紧凑,会根据列表值的数量压缩到一个或两个字节。MySQL自身会维护一个查找表。例如:

CREATE TABLE enum_test(

`gender` ENUM("男","女","其他") NOT NULL

);

INSERT INTO enum_test values("男"),("女"),("其他");

对于状态字段,可以尝试使用 ENUM 来存放。

避免使用NULL字段,很难查询优化且占用额外索引空间。

****************************************************华丽的分割线**************************************************************

一。char和varchar

char是固定长度的,查询速度比varchar速度快的多。char的缺点是浪费存储空间。

检索char列时,返回的结果会删除尾部空格,所以程序需要对为空格进行处理。

对于长度变化不大且对查询速度有较高要求的数据可以考虑使用char。

随着MySQL的不断升级,varchar的性能不断改进并提高。

存储引擎使用原则:

MyISAM:建议使用固定长度列代替可变长度列。

InnoDB:建议使用varchar类型

二。text和blob

在保存大文本时,通常选择text或者blob。

二者的差别是blob可以保存二进制数据,比如照片。

text和blob又包括text、mediumtext、longtext和blob、mediumblob、longblob,他们之间的区别是存储文本长度不同和存储字节不同。

应根据情况选择满足需求的最小存储类型。

1.blob和text执行大量删除操作时,产生数据“空洞”

删除id为7记录前后数据库所占内存,没有发生变化。

可以发现数据文件并没有因为数据删除而减少。

对表进行optimize(优化)操作:

optimize table t1;

可以发现表数据文件大大缩小,“空洞”空间已经被回收。

2.用合成(Synthetic)索引提高查询性能

根据大文本字段(text、blob)的内容建立一个散列值,并把这个值存储在单独的数据列中,然后通过散列值找数据行。

缺点:只能进行精确查询(=范围操作符是没有用处的)

可以通过MySQL自带函数md5()、sha1()、crc32()生成散列值,也可以通过编程语言计算散列值。

注:如果散列算法生成的字符串带有尾部空格,不要把他们存储在char、varchar列中,他们会受到尾部空格去除的影响。

如果需要对blob或clob字段进行模糊查询,可以用前缀索引:

合成索引只能用于精确匹配,在一定程度上减少了I/O,从而提高了查询效率。

3.在不必要的时候避免检索大型的blob或text值。

4.把blob或text列分离到单独的表中。

三、浮点数和定点数

1.浮点数存在误差问题。

2.对货币等对精度敏感的数据,应该用定点数表示或存储。

3.在编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较。

4.要注意一些特殊值的处理。

四、日期类型的选择

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

2.如果记录年月日时分秒,并且记录年份比较久远,最好使用datetime,不要使用timestamp。

3.如果记录的日期需要让不同时区的用户使用,最好使用timestamp,因为日期类型中只有它能够和实际时区相对应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

am335x uart5配置

任务:配置uart5

XML Schema ---complexType-----复合元素

混合的复合类型可包含属性、元素以及文本。 带有混合内容的复合类型 XML 元素&#xff0c;"letter"&#xff0c;含有文本以及其他元素&#xff1a; <letter>Dear Mr.<name>John Smith</name>.Your order <orderid>1032</orderid>will …

Java笔记(一)—StringBuilder类

1、StringBuilder类概述 StringBuilder是一个可变的字符串类&#xff0c;主要指的是StringBuilder对象 中的内容是可变的。与之相比String对象的内容是不变的。2、StringBuilder常用构造方法 public StringBuilder() {} //创建空白可变字符串 public StringBuilder(String st…

ubuntu下制作u盘镜像_deepin下制作win10启动U盘

1.准备①下载multibootusb&#xff1a;http://multibootusb.org/page_download/ ②准备一个win10的镜像文件 ③准备一个U盘&#xff0c;最好先备份U盘数据再格式化一道2.打开multibootusb工具输入开机密码&#xff0c;点击认证3.multibootusb操作部分①选择U盘的第一个分区 ②安…

Shared_from_this 几个值得注意的地方

shared_from_this()是enable_shared_from_this<T>的成员 函数&#xff0c;返回shared_ptr<T>。首先需要注意的是&#xff0c;这个函数仅在shared_ptr<T>的构造函数被调用之后才能使 用。原因是enable_shared_from_this::weak_ptr并不在构造函数中设置&#x…

asterisk1.8 账号信息mysql存储(动态)

1. 首先需要先编译出以下6个模块 res_realtime.so pbx_realtime.so func_realtime.so res_config_mysql.so app_mysql.so cdr_mysql.so 其中有些模块&#xff0c;asterisk默认并不编译&#xff0c;需要修改menuselect.makeopts这个文件&#xff0c;将里面的相应…

签证上的mult是什么意思_申根签证中mult是什么意思

展开全部申根签证中mult是是多次的意思&#xff0c;指可以在有效期内多次往返申根国家。类型申根签证分62616964757a686964616fe78988e69d8331333431373939为入境和过境两类。1.入境签证有一次入境和多次入境两种。签证持有者分别可一次连续停留90天或每半年多次累计不超过3个月…

Java拆分字符串

1、例如给出如下字符串"91 27 46 38 50"如何将其拆分成{"91", "27", "46", "38", "50"}呢&#xff1f;2、我们可以通过String类中的public String[] split(String regex)方法来实现String s "91 27 46 38 5…

Perl正则表达式匹配

\w([-.]\w)*((aa.com)|(bb.com)|(163.com)) 这个正则表达式可实现匹配含有aa.com或bb.com或163.com 的email 转载于:https://www.cnblogs.com/inbase/archive/2013/04/01/2994479.html

大数据翻页_大数据量下的分页解决方法

最好的办法是利用sql语句进行分页&#xff0c;这样每次查询出的结果集中就只包含某页的数据内容。再sql语句无法实现分页的情况下&#xff0c;可以考虑对大的结果集通过游标定位方式来获取某页的数据。sql语句分页&#xff0c;不同的数据库下的分页方案各不一样&#xff0c;下面…

centos7 安装git_Centos7.4 Yapi 服务搭建

Centos Yapi服务搭建转载请标明原文出处参考以下网址&#xff0c;排名不分先后https://github.com/YMFE/yapihttps://blog.csdn.net/guangzhou007_java/article/details/90779222https://www.jianshu.com/p/994bc7b19b26我的服务器环境阿里云服务器 centos 7.4使用 https://one…

asterisk使用MYSQL认证的配置方法

asterisk要使用MYSQL实时认证peers&#xff0c;就必须安装asterisk的realtime 和 mysql 模块&#xff0c;这些模块在asterisk插件包中 下载地址是&#xff1a;http://www.asterisk.org/downloads 下载之后./configure 然后sudo make &&sudo make install && …

Java笔记—字符缓冲流

一、字符缓冲流构造方法简述 BufferedReader&#xff1a;从字符输入流中读取文本&#xff0c;缓冲各个字符&#xff0c;从而实现字符、 数组和行的高效读取。 可以指定缓冲区的大小&#xff0c;或者可使用默认的大小。大 多数情况下&#xff0c;默认值就足够大了。构造方法&am…

手机来电秀怎么开启_360手机卫士怎么设置来电秀 360手机卫士来电秀设置方法...

360手机卫士除了防护等安全功能外&#xff0c;它的来电秀也是比较火热的&#xff0c;很多朋友都喜欢在这里设置自己别具个性的来电秀&#xff0c;这篇文章就一起了解一下360手机卫士怎么设置来电秀。360手机卫士来电秀设置是在【隐私保护】中&#xff0c;所以很多朋友都没找到在…

SqlServer查询语句中用到的锁

前段时间**公司DBA来我们这培训。讲了一大堆MYSQL的优化。 QA环节一程序员问“SQL语句中的 with nolock 除了不锁表外,是否能读其他锁住的数据"。 讲课的人嘟嘟了半天没解释清楚&#xff08;有可能是MYSQL里没有这个机制&#xff09;&#xff0c;公司的另一程序员给出了一…

python中execute函数_Python中的函数定义与参数使用

本节知识点&#xff1a;(1)函数定义格式&#xff1b;(2)五种参数使用函数定义 基本语法格式def function_name( parameter_list ): return values函数通常为小写英语单词及其组合&#xff0c;以下划线隔开&#xff0c;例如&#xff1a;sum、mean、cost_calculat…

Java学习笔记—生产者和消费者模式

一、生产者和消费者问题 生产者消费者模式是一个十分经典的多线程协作的模式。 生产者和消费者问题包含了两类线程&#xff1a;一类是生产者线程用于生产数据&#xff0c; 一类是消费者数据用于消费数据。/*生产者消费者案例 包含一个奶箱类&#xff0c;一个生产者类&#xff…

window中搭建jenkins_Jenkins自动化部署(Windows服务器)

Jenkins自动化部署(Windows服务器)背景&#xff1a;一直部署SSM项目&#xff0c;每次都是 在tomcat的webapps目录下&#xff0c;将项目压缩成zip格式压缩包&#xff0c;拷贝的windows服务器的tomcat的webapps目录下&#xff0c;解压缩&#xff0c;覆盖&#xff0c;启动tomcat。…

C++ 堆、栈、自由存储区、全局静态存储区和常量存储区

文章来自一个论坛里的回帖&#xff0c;哪个论坛记不得了&#xff01; 在C中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量存…

内存spd规范_C语言内存泄露很严重,如何应对?

原文&#xff1a;https://blog.csdn.net/devcloud/article/details/1083359121.前言 最近部门不同产品接连出现内存泄漏导致的网上问题&#xff0c;具体表现为单板在现网运行数月以后&#xff0c;因为内存耗尽而导致单板复位现象。一方面&#xff0c;内存泄漏问题属于低级错误&…