作者:matrix
发布时间:2024-11-30
分类:mysql
设计数据库字段时很少在意这个括号数字的含义,都是大概知道不影响数据存储所以没在意。今天正好看到也就好奇下。
mysql中,INT(5) 和 INT(11)这里的数字(5、11)实际上并不限制数值的存储范围或内存使用,而是显示宽度。
这个显示宽度在字段在带有 ZEROFILL(零填充)才有用
这里不仅限于int
类型,也包含tinyint、smallint、mediumint、bigint...
比如 设定字段类型int(5)
存入1显示为 00001
存入82显示为 00082
存入123456显示为 123456
select id,type from table;
******************** 1. row *********************
id: 1
type: 123456
******************** 2. row *********************
id: 2
type: 00008
******************** 3. row *********************
int(10)同理,其他数字类型亦是。所以说括号里的数字其实没有任何影响,很多场景实际上不会用到。
可能也是考虑到这点,目前mysql8+的版本如果建表时字段设置了显示宽度,会有Warning。所以不管mysql版本号,新建数字类型字段都不用设置显示宽度,除非你是需要ZEROFILL。
字段的ZEROFILL如下声明:
CREATE TABLE example (
id INT(5) ZEROFILL NOT NULL,
name VARCHAR(100)
);
只有这样声明了ZEROFILL
才有用
PEACE~
作者:matrix
发布时间:2021-12-28
分类:mysql PHP
结论
不要用float、double类型存储浮点数。改用decimal字段类型
过程
之前是知道浮点数最好不要用float类型做存储,手上遇到老项目使用就正好是float字段存储的体重数据,比如51.6
这种。
普通的查询没问题,个别数据就出现查询为空的问题。后来发现都是浮点类型数据,排查框架的sql日志到PDO的参数绑定找遍了都没找到根源。还以为是PDO扩展的data_type出错,因为内部sql执行时浮点数的参数绑定是使用PDO::PARAM_STR
。
$this->PDOStatement->bindValue(':ThinkBind_1_', 51.6, PDO::PARAM_STR)
虽然字段设置了精度float(10,2)
,但是依然有查询为空出现。这就是float精度导致的问题。
吐槽
TP5.1 sql日志输出不准确,和实际执行的不一致!
sql输出日志为where wi=51.6
,实际上执行是where wi="51.6"
,这也增加了排查的难度。
办法
- 浮点数查询使用like
- 使用函数比如
oncat(wi)=51.6
,或者format(wi,2) = format(51.6 ,2)
- 使用
decimal
字段类型
参考:
https://www.cnblogs.com/powerwu/articles/8465031.html
https://blog.csdn.net/luccs624061082/article/details/84286253
作者:matrix
发布时间:2021-03-31
分类:mysql
平时习惯使用mysql客户端工具直接导出表数据,这突然需要导出指定前缀的表反而变得麻烦,因为表非常多但又不想全部选择。
e.g. 导出dict_
开头的数据表
查询符合条件的表名
select table_name from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'heal' and table_name like 'dict_%';
执行导出命令
mysqldump --column-statistics=0 -h 127.0.0.1 -P3306 -pPASSWORD -t heal -uroot --tables dict_union dict_tag > ~/db_script.sql
-P端口号
-p密码
--tables
指定多个数据表
报错 mysqldump: Couldn't execute
mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'heal' AND TABLE_NAME = 'dict_union';': Unknown table 'COLUMN_STATISTICS' in information_schema
需要添加参数--column-statistics=0
参考:
https://www.cnblogs.com/commissar-Xia/p/10302336.html
https://researchlab.github.io/2017/02/22/mysql-import-export-summary/
作者:matrix
发布时间:2020-03-31
分类:mysql
需要每天定时删除旧数据 避免占用大量磁盘空间
用到mysql事件调度器event_scheduler
SHOW VARIABLES LIKE 'event_scheduler'; # 查看开关
SET GLOBAL event_scheduler = ON; #打开事件调度器
#查看事件
SHOW EVENTS;# 其中 EVENT_DEFINITION字段为事件执行的sql语句
select EVENT_NAME,LAST_EXECUTED from information_schema.EVENTS;
DROP EVENT [IF EXISTS] event_name;#删除事件
定时删除旧数据
#每天定时清理 只保留最近30天数据schedule_del_depth5_eos_quarter表
CREATE EVENT IF NOT EXISTS schedule_del_depth5_eos_quarter
ON SCHEDULE EVERY 1 DAY
STARTS concat(CURRENT_DATE,' 00:00:00')
DO
delete from schedule_del_depth5_eos_quarter where timestamp < DATE_FORMAT( date_sub(curdate(),interval 30 day) ,'%Y-%m-%d');
参考:
https://www.cnblogs.com/geaozhang/p/6821692.html
https://blog.csdn.net/beyondlpf/article/details/39672599
https://blog.csdn.net/small____fish/article/details/7621160
https://blog.csdn.net/qq_33083551/article/details/88789311