项目场景:

提示:这里简述项目相关背景:

使用MySQL数据库,因数据库字段可存储长度设置的小了,已达到设置字符类型的存储上限,导致数据存储时报错

问题描述

提示:这里描述项目中遇到的问题:

因数据库字段可存储长度设置的小了,导致数据存储时报错,错误信息如下所示:

Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'remark' at row 1


原因分析:

提示:这里填写问题的分析:

数据库字段可存储的字符长度设置的小了,字段的存储类型没有选择合适的类型,不同的数据类型存储的字符长度不同。
在这里插入图片描述
所以我们要为数据库中的字段设置合理的存储空间,否则会导致存储失败或者空间的浪费。

解决方案:

提示:这里填写该问题的具体解决方案:

应选择合适 的字段类型 ,并根据实际需求设置适当的 字符长度

总结:

字段类型的设计和选择

一、单表字段不宜过多*

建议最多30个以内

字段越多,会导致性能下降,并且增加开发难度

**

二、使用小而简单的合适数据类型*

a.字符串类型

固定长度使用 char,非定长使用 varchar ,并分配合适且足够的空间

char 在查询时,会把末尾的空格去掉

b.小数类型

一般情况可以使用 floatdouble ,占用空间小,但存储可能会损失精度

decimal 可存储精确小数,存储财务数据或经度要求高时使用decimal

c.时间日期

通常尽量使用 timestamp ,因为它占用空间小,并且会自动进行时区转换,无需关心地区时差

datetimetimestamp 只能存储最小颗粒度是秒,可以使用 BIGINT 类型存储微秒级别的时间戳

d.大数据 blob和text

blobtext 是为存储很大的数据的而设计的字符串数据类型,但通常建议避免使用

MySQL 会把每个 blobtext 当做独立的对象处理,存储引擎存储时会做特殊处理,当值太大,InnoDB使用专门的外部存储区域进行存储,行内存储指针,然后在外部存储实际的值。这些都会导致严重的性能开销

blob 是二进制字符串,text是非二进制字符串,两者均可存放大量的信息。Blob主要存储图片、音频信息等,而text只能存储纯文本文件。

三、尽量将列设置为NOT NULL

a.可为NULL的列被索引时,占用更多的存储空间,一般,把可为NULL的列改为NOT NULL带来的提升比较少。

b.可为NULL的列,在使用索引和值比较时,MySQL需要做特殊的处理,损耗一定的性能,更难优化

建议:通常最好指定列为NOT NULL,除非真的需要存储NULL值

四、尽量使用整型做主键

a.整数型通常是标识列最好的选择,因为它们很快并且可以使用AUTO_INCREMENT

b.应该避免使用字符串类型作为标识列,因为它们很消耗空间,并且通常比数字类型慢

c.对于完全"随机"的字符串也需要多加注意。例如:MD5(),SHAI()或者UUID()产生的字符串。这些函数生成的新值也任意分布在很大空间内,这会导致INSERT和一些SELECT语句很缓慢

五、数据类型及相应的长度设置

每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。
常见的数据类型有: 字符串、数值、日期和时间、二进制数据类型。
在这里插入图片描述
(一)、字符串数据类型
在这里插入图片描述
(二)、数值数据类型
在这里插入图片描述
(三)、日期和时间数据类型
在这里插入图片描述
(四)、二进制数据类型
在这里插入图片描述

更多推荐