站群系统开发,做旅游网站推广,佛山网站建设方案咨询,注入漏洞网站源码MySQL表字段数据类型设计建议 前言阿里巴巴Mysql字段类型规范一、数值类型二、日期和时间类型三、字符串类型四、IP存储总结 前言
最新的 Java 面试题#xff0c;技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…… MySQL表字段数据类型设计建议 前言阿里巴巴Mysql字段类型规范一、数值类型二、日期和时间类型三、字符串类型四、IP存储总结 前言
最新的 Java 面试题技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等会持续更新。
如果对老铁有帮助帮忙免费点个赞谢谢你的发财手
阿里巴巴Mysql字段类型规范
在MySQL中选择正确的数据类型对于性能至关重要。一般应该遵循下面两步
1确定合适的大类型数字、字符串、时间、二进制2确定具体的类型有无符号、取值范围、变长定长等。 在MySQL数据类型设置方面尽量用更小的数据类型因为它们通常有更好的性能花费更少的硬件资源。并且尽量把字段定义为NOT NULL避免使用NULL。 一、数值类型
类型大小范围有符号范围无符号用途TINYINT1 字节(-128, 127)(0, 255)小整数值SMALLINT2 字节(-32 768, 32 767)(0, 65 535)大整数值MEDIUMINT3 字节(-8 388 608, 8 388 607)(0, 16 777 215)大整数值INT或INTEGER4 字节(-2^ 31 , 2^31 - 1)(0, 2^32 - 1)大整数值BIGINT8 字节(-2^ 63 , 2^63 - 1)(0, 2^64 - 1)极大整数值FLOAT4 字节单精度浮点数值DOUBLE8 字节双精度浮点数值DECIMAL对DECIMAL(M,D) 如果MD为M2否则为D2依赖于M和D的值依赖于M和D的值小数值
优化建议
1、如果整形数据没有负数如ID号建议指定为UNSIGNED无符号类型容量可以扩大一倍。2、建议使用TINYINT代替ENUM、BITENUM、SET。3、避免使用整数的显示宽度(参看文档最后)也就是说不要用INT(10)类似的方法指定字段显示宽度直接用INT。4、DECIMAL最适合保存准确度要求高而且用于计算的数据比如价格但是要注意长度设置。5、建议使用整形类型来运算和存储实数方法是实数乘以相应的倍数后再操作。6、整数通常是最佳的数据类型因为它速度快并且能使用AUTO_INCREMENT。 INT显示宽度 我们经常会使用命令来创建数据表而且同时会指定一个长度但是这里的长度并非是TINYINT类型存储的最大长度而是显示的最大长度如下 CREATE TABLE user(age TINYINT(2) UNSIGNED...
);这里表示user表的age字段的类型是TINYINT可以存储的最大数值是255。 所以在存储数据时如果存入值小于等于255如200虽然超过2位但是没有超出TINYINT类型长度所以可以正常保存 如果存入值大于255如500那么MySQL会自动保存为TINYINT类型的最大值255。 在查询数据时不管查询结果为何值都按实际输出。这里TINYINT(2)中2的作用就是当需要在查询结果前填充0时命令中加上ZEROFILL就可以实现如下 CREATE TABLE user(age TINYINT(2) UNSIGNED ZEROFILL...
);这样查询结果如果是5那输出就是05。如果指定TINYINT(5)那输出就是00005其实实际存储的值还是5而且存储的数据不会超过255只是MySQL输出数据时在前面填充了0。 换句话说在MySQL命令中字段的类型长度TINYINT(2)、INT(11)不会影响数据的插入只会在使用ZEROFILL时有用让查询结果前填充0。 二、日期和时间类型
类型大小范围格式用途DATE3 字节1000-01-01 到 9999-12-31YYYY-MM-DD日期值TIME3 字节‘-838:59:59’ 到 ‘838:59:59’HH:MM:SS时间值或持续时间YEAR1 字节1901 到 2155YYYY年份值DATETIME8 字节1000-01-01 00:00:00 到 9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值TIMESTAMP4 字节1970-01-01 00:00:00 到 2038-01-19 03:14:07YYYYMMDDhhmmss混合日期和时间值时间戳
优化建议
1、MySQL能存储的最小时间粒度为秒。2、建议用DATE数据类型来保存日期。MySQL中默认的日期格式是yyyy-mm-dd。3、用MySQL的内建类型DATE、TIME、DATETIME来存储时间而不是使用字符串。4、当数据格式为TIMESTAMP和DATETIME时可以用CURRENT_TIMESTAMP作为默认MySQL5.6以后MySQL会自动返回记录插入的确切时间。5、TIMESTAMP是UTC时间戳与时区相关。6、DATETIME的存储格式是一个YYYYMMDD HH:MM:SS的整数与时区无关你存了什么读出来就是什么。7、除非有特殊需求一般的公司建议使用TIMESTAMP它比DATETIME更节约空间但是像阿里这样的公司一般会用DATETIME因为不用考虑TIMESTAMP将来的时间上限问题。8、有时人们把Unix的时间戳保存为整数值但是这通常没有任何好处这种格式处理起来不太方便我们并不推荐它。
三、字符串类型
类型大小用途CHAR0-255字节定长字符串char(n)当插入的字符串实际长度不足n时插入空格进行补充保存。在进行检索时尾部的空格会被去掉。VARCHAR0-65535 字节变长字符串varchar(n)中的n代表最大列长度插入的字符串实际长度不足n时不会补充空格TINYBLOB0-255字节不超过 255 个字符的二进制字符串TINYTEXT0-255字节短文本字符串BLOB0-65 535字节二进制形式的长文本数据TEXT0-65 535字节长文本数据MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据MEDIUMTEXT0-16 777 215字节中等长度文本数据LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据LONGTEXT0-4 294 967 295字节极大文本数据
优化建议
1、字符串的长度相差较大用VARCHAR字符串短且所有值都接近一个长度用CHAR。2、CHAR和VARCHAR适用于包括人名、邮政编码、电话号码和不超过255个字符长度的任意字母数字组合。 那些要用来计算的数字不要用VARCHAR类型保存因为可能会导致一些与计算相关的问题。换句话说可能影响到计算的准确性和完整性。3、尽量少用BLOB和TEXT如果实在要用可以考虑将BLOB和TEXT字段单独存一张表用id关联。4、BLOB系列存储二进制字符串与字符集无关。5、TEXT系列存储非二进制字符串与字符集相关。6、 BLOB和TEXT都不能有默认值。
四、IP存储
1、在MySQL中当存储IPv4地址时应该使用32位的无符号整数UNSIGNED INT来存储IP地址而不是使用字符串用UNSIGNED INT类型存储IP 地址是一个4字节长的整数。2、IP地址数据采用整数UNSIGNED INT存储在存储和CPU资源使用上都少于字符串存储形式在歧义较大的范围查询中存储整数方式无需关系范围中的位数问题查询更加直观方便。3、但整数存储需要使用INET_ATON()、INET_NTOA()等特定函数处理可读性查。4、因此需要范围查询且数据量很大如亿级以上采用数值存储IP地址的方式更好。如果均是唯一IP精确查询或数据量不大那么使用字符串操作更为简单。
总结
都已经看到这里啦赶紧收藏起来祝您工作顺心生活愉快