前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >一个奇怪的SQL问题

一个奇怪的SQL问题

作者头像
AsiaYe
发布于 2019-11-06 06:31:54
发布于 2019-11-06 06:31:54
8740
举报
文章被收录于专栏:DBA随笔DBA随笔

今天在进行SQL审核的时候,遇到了一个奇怪的SQL,SQL如下:

create table datatype10

(d_tinyint int not null default 1 comment "a",

d_smallint int not null default 1 comment 'a',

d_timestart timestamp default '1970-01-01 08:00:03' not null ,

d_timestop timestamp default '2038-01-19 11:14:06' not null ,

d_enum enum('man','woman')

);

该SQL在执行的时候,报三个警告,本机版本是5.7.16的MySQL数据库,当时不理解,打开warnings看看到底是什么原因:

很明显,提示timestamp时间类型的值不对,需要修改时间值,于是查阅Timestamp类型的正确范围,得到结果是:1970-01-01 00:00:01到2038-01-19 03:14:07 ,再通过地理位置计算得知我们需要的正确时间值是:1970-01-01 08:00:01到2038-01-19 11:14:07

看了看自己输入的时间值,是在范围内的,那么为什么会出现这个结果呢?于是将这个SQL通过拷贝的方式给同事看看,同事拿到SQL在他那边跑了一下,输出的结果如下:

create table datatype10

(d_tinyint int not null default 1 comment "a",

d_smallint int not null default 1 comment 'a',

d_timestart timestamp default '1970-01-01 08:00:03' not null ,

d_timestop timestamp default '2038-01-19 11:14:06' not null ,

d_enum enum('man','woman')

);

直接通过了,我去,难道SQL语句也看人品么,我不服,重新尝试了自己的SQL,还是一直报错:

同事坐在我的电脑旁边进行操作,拷贝了我俩聊天记录里面的我给他的SQL,在我的电脑上显示的结果:

what a pity!!!我去,还真是,看人品啊,人家跑就可以,我自己跑就报警告,为什么呢,当时很不理解这个问题,但是读者们看到这里,可能心里已经有了答案,那就是我给同事的SQL和我自己跑的那个SQL肯定不是一样的!!!

于是,重新将两个SQL跑了下,进行了对比,结果如下:

果然是这样的,到底是什么原因导致这种问题呢,肯定是两者的内容有不一样的地方,于是将两个SQL语句放在一个文件里面,利用:

cat -v 文件名

命令,查看文件中的隐藏字符,结果如下:

原来如此!!!看到这里,可能恍然大悟了,原来是文字在拷贝的过程中发生了变化,我的SQL本身存在”M-BM-”的字符在里面,复制粘贴给同事之后,这个东西就莫名其妙的消失了,也就是说,通过拷贝,把我错误的SQL字符给自动修正了,所以他的就可以跑,我的就不能跑!!!

一个小小的问题,疑惑和很久,于是想着,既然有问题,就直接把这个奇怪的字符换成一个可见的字符处理一把,看看结果有什么差异,于是有了下面的SQL:

create table datatype10

(d_tinyint int not null default 1 comment "a",

d_smallint int not null default 1 comment 'a',

d_timestart timestamp default '1970-01-01 08:00:03' not null ,

d_timestop timestamp default '2038-01-19 11:14:06' not null ,

d_enum enum('man','woman')

);

//注意,这里给timestamp类型中间添加了可见的字符a

create table datatype10

(d_tinyint int not null default 1 comment "a",

d_smallint int not null default 1 comment 'a',

d_timestart timestamp default '1970-01-01a08:00:03' not null ,

d_timestop timestamp default '2038-01-19a11:14:06' not null ,

d_enum enum('man','woman')

);

结果如下:

到这里,问题已经和明确了,确实是因为两个SQL不一样导致的,我的SQL可能因为中英文切换的原因,夹杂进来一个不需要的字符,导致整个SQL报警告,但是也证明了一点,timestamp不会对这种警告进行处理,只会通过警告的方式告诉DBA,这个数据可能有问题,这个表还是被创建成功了。

所以以后遇到这种问题,尽量还是保持字符的统一,不要来回切换中英文,保证文本编辑器都在统一系统的utf-8编码格式下进行。

虽然问题很小,但是还算有所收获,就分享出来,大家高兴高兴!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于 MySQL 数据类型
drop table if exists test_time; create table test_time(     year_value year,     date_value date,     time_value time,     datetime_value datetime,     timestamp_value timestamp )engine=innodb default charset=utf8 comment="测试时间表";
星哥玩云
2022/08/18
5840
SQL性能治理经验谈
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
后台技术汇
2024/09/19
1400
SQL性能治理经验谈
MySQL支持的数据类型
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
changxin7
2019/09/10
1.6K0
Mysql5.7版本中数据表字段可用的类型
为什么会有这个总结,因为在测试Mysql的字符串函数时发现,char 和 varchar 有些不同,网上搜索一番发现了各种char、varchar、nvarchar 类型的对比,还有一些奇奇怪怪的这里就不说了,然后我就开始了对这几种类型字符串的测试,接着就悲剧了,测试多次之后发现创建为nvarchar类型的字段居然是varchar类型的,再查询官方文档后发现,当前版本(5.7.21)的Mysql根本就没有nvarchar类型的字段,白白浪费了时间,所以要把Mysql支持的字段列举在这里,方便后面查找使用。
全栈程序员站长
2022/02/18
1K0
MySQL全字段类型概览
MySQL支持多种数据类型:数字类型,日期和时间类型,字符类型,空间类型和JSON类型。
@阿诚
2022/03/04
3.3K0
字段规范 原
char、varchar、text等字符串类型定义 对于长度基本固定的列,如果该列恰好更新又特别频繁,适合char varchar虽然存储变长字符串,但不可太小也不可太大。UTF8最多能存21844个汉字,或65532个英文 varbinary(M)保存的是二进制字符串,它保存的是字节而不是字符,所以没有字符集的概念,M长度0-255(字节)。只用于排序或比较时大小写敏感的类型,不包括密码存储 TEXT类型与VARCHAR都类似,存储可变长度,最大限制也是2^16,但是它20bytes以后的内容是在
wuweixiang
2018/08/14
2930
由一条create语句的问题对比mysql和oracle中的date差别 (r7笔记第26天)
今天开发的同事提交过来一个sql变更,在部署的时候发现了一个问题。 语句是一个简单的create语句 CREATE TABLE `test_user` ( `openid` varchar(64) NOT NULL, `amount` varchar(11) DEFAULT 0, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMA
jeanron100
2018/03/16
1.3K0
MySQL数据类型
Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
星哥玩云
2022/08/18
2.4K0
MySQL数据类型
MySQL创建数据表和MySQL数据类型
实例解析: * 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。 * AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。 * PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。 * ENGINE 设置存储引擎,CHARSET 设置编码。
周小董
2019/03/25
6K0
MySQL创建数据表和MySQL数据类型
学习笔记 | MySQL 数据类型
最好的资料是 官方文档 !!! Data Type Storage Requirements Numeric Types | 数值型 官方说明文档: https://dev.mysql.com/doc/refman/5.6/en/integer-types.html TINYINT, 1Bytes SMALLINT, 2Bytes MEDIUMINT, 3Bytes INT, 4Bytes BIGINT, 8Bytes FLOAT | DOUBLE | DECIMAL ,指定精度 FLOAT(5,3)可以显
许杨淼淼
2018/07/11
4750
Mysql学习之路-数据类型
MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
Daimon
2023/04/01
3210
SQL审核定制进度
今天一天都在做SQL审核定制的事情,尝试定制的审核规则如下,一共13条,每天审核规则后面给出了预估难度,其中红色标注的审核规则是今天完成的部分,剩余的是需要后续接着完善的规则,整理下今天产出的结果集。
AsiaYe
2019/11/06
5490
SQL审核定制进度
又谈mysql,面试官问表结构设计要注意啥?
排序规则(Collation)是比较和排序字符串的一种规则,每个字符集都会有默认的排序规则,可以使用命令 SHOW CHARSET 来查看:
微客鸟窝
2021/10/20
7750
MySQL数据库应用总结(六)—MySQL数据库的数据类型和运算符(上)
该文介绍了MySQL数据库中的一种特殊类型——枚举类型,并说明了在哪些场景下使用枚举类型比较合适。同时,介绍了在MySQL中枚举类型与枚举值的区别,以及枚举类型在SQL语句中的应用方法。
企鹅号小编
2018/01/02
3.3K0
MySQL数据库应用总结(六)—MySQL数据库的数据类型和运算符(上)
mysql多字段主键_sql改变列数据类型
整数类型:tinyint、smallint、mediumint、integer、bigint
全栈程序员站长
2022/09/28
2.6K0
mysql多字段主键_sql改变列数据类型
MySQL的timestamp字段可以使用的范围是多少
还是之前工作中遇到的一个小问题。我在做一个收据采集的程序,需要记录起始时间和结束时间,在数据库中是用timestamp字段来保存的,有些情况下不存在起始时间,此时就需要设置一个默认的起始时间,当初想着是使用timestamp类型的『最小值』。
用户3579639
2018/10/22
2.3K0
网易MySQL微专业学习笔记(一)-mysql数据类型
这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。
WindCoder
2018/09/19
7650
网易MySQL微专业学习笔记(一)-mysql数据类型
【小家SQL】MySql数据类型---日期时间类型的使用(含datetime和timestamp的区别) 0000-00-00 00:00:00问题解释
在这一路学习过来,每次不管看书还是网上看的资料,对于MySQL数据类型中的时间日期类型总是一扫而过,不曾停下来认认真真的研究学习。最近看了一本关于MySql的书籍,打算全面的学习研究一遍。
YourBatman
2019/09/03
7.3K0
【小家SQL】MySql数据类型---日期时间类型的使用(含datetime和timestamp的区别) 0000-00-00 00:00:00问题解释
SQL操作表
现在,我们来创建一个自己的数据库,名字就叫test吧!然后,我们在test数据库中创建一张表。在干这些之前,我们必须了解MySQL的数据类型。
zy010101
2020/12/18
1.2K0
SQL操作表
MySQL开发规范之数据类型设计规范
说来惭愧,这是耽误了将近1年的工作,一直零零散散拖着没做完,昨天总算是卯着劲出了一个版本。
jeanron100
2023/09/04
2260
MySQL开发规范之数据类型设计规范
相关推荐
关于 MySQL 数据类型
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文