项目场景:
提示:这里简述项目相关背景:
使用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.小数类型
一般情况可以使用 float 或 double ,占用空间小,但存储可能会损失精度
decimal 可存储精确小数,存储财务数据或经度要求高时使用decimal
c.时间日期
通常尽量使用 timestamp ,因为它占用空间小,并且会自动进行时区转换,无需关心地区时差
datetime 和 timestamp 只能存储最小颗粒度是秒,可以使用 BIGINT 类型存储微秒级别的时间戳
d.大数据 blob和text
blob 和 text 是为存储很大的数据的而设计的字符串数据类型,但通常建议避免使用
MySQL 会把每个 blob 和 text 当做独立的对象处理,存储引擎存储时会做特殊处理,当值太大,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语句很缓慢
五、数据类型及相应的长度设置
每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。
常见的数据类型有: 字符串、数值、日期和时间、二进制数据类型。
(一)、字符串数据类型
(二)、数值数据类型
(三)、日期和时间数据类型
(四)、二进制数据类型