4.Mysql相关

本文深入探讨了数据库中各种时间数据类型(如date、time、datetime和timestamp)的使用场景与转换方式,以及bit、bigint和tinyint等数据类型的适用情况。同时,解析了SQL中的常见问题,如update子查询的死锁问题,以及如何锁定数据进行操作。此外,还介绍了MySQL中的时间戳函数和计数查询技巧。

一、数据类型:

1、时间(修改时间、创建时间)

date – > 1000-01-01 to 9999-12-31 ------------javaTypejava.sql.Date

mybatis中jdbcType="DATE"
实体类中LocalDate类型

time – > 00:00:0023:59:59 ------------javaTypejava.sql.Time

券不可用时间

datetime --> 1000-01-01 00:00:00 to 9999-12-31 23:59:59 -------------javaTypejava.sql.Timestamp

mybatis中jdbcType="TIMESTAMP"
实体类中LocalDateTime类型
券生效日期,失效日期,截止日期

timestamp(时间戳) -->1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07-------------javaTypejava.sql.Timestamp

mybatis中jdbcType="TIMESTAMP"
实体类中LocalDateTime类型
只占4字节,而datetime占8字节
在关心创建时间更新时间的情况下,建议将更新时间设置为时间戳字段。
时间戳会自动转换时区
如果存进去的是NULL,timestamp会自动储存当前时间,而 datetime会储存 NULL。

2、bit—(是否已经删除)

mybatis中jdbcType="BIT"
实体类中:boolean类型

利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似Boolean类型中的True和False。

插入
插入数据时,插入true,false,数据库会相应的转换成1,0

更新
更新最常用的办法肯定是先查询判断再进行更新,这样就需要先查询一次,再执行更新.
如果不想进行查询,直接对它进行更新,每次得到更新前的相反值的话,可以使用一下方法:
1)、substr函数

update anketo1 set fb = substring(10,fb+1,1) WHERE id =5

2)、直接取反

update anketo1 set fb = ~ fb WHERE id =5

3)、用ABS取绝对值

update anketo1 set fb = abs(fb-1)

查询
查询数据时,得到的数据是0和1,而不是true或false

3、bigint—(订单金额,满减金额,操作记录的自增id)

mybatis中jdbcType="long"
实体类中:long类型

从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节。
在支持整数值的地方支持 bigint 数据类型。但是,bigint 用于某些特殊的情况,当整数值超过 int 数据类型支持的范围时,就可以采用 bigint。

4、tinyint—(操作类型,记录类型,不同的数字代表不同的类型)

从 0 到 255 的整型数据。存储大小为 1 字节。

mybatis中jdbcType="TINYINT"
实体类中:short类型


二、SQL问题

1.问题update中的子查询会加共享锁,引起死锁问题

例如:

update a set a.c=a.c-1 where (select q.cc from (select a.c cc from a) q )>1

原因在默认的事务隔离级别下,即REPEATABLE READ下,InnoDB存储引擎采用Next-Key Locking机制(Gap Lock间隙锁+Record Lock行锁)来避免Phantom Problem(幻象问题)
行锁的三种算法

补充:
如何锁住一行数据或整张表进行操作?(使用for update)
在这里插入图片描述
当for update的字段为索引或者主键的时候,只会锁住索引或者主键对应的行。
当for update的字段为普通字段的时候,Innodb会锁住整张表。

2.mysqsl中的函数

2.1unix_timestamp函数:返回一个确切时间点的时间戳(有两种重载形式)

unix_timestamp(),返回自1970-1-1 8:00:00开始到当前系统时间为止的秒数。
unix_timestamp(date),返回1970-1-1 8:00:00开始到date所代表的时间为止的秒数,对于早于1970-1-1 8:00:00的时间,总是返回 0 。
在这里插入图片描述

2.2from_unixtime(unixtime) 根据时间戳返回一个确切的时间
在这里插入图片描述

3.查询表中所有数据条数

SELECT COUNT(1) FROM `表名`

4.in 和 not in

not in

错误的使用方法!!! 原因:子查询中不能有null,如果有null,则结果必为0

SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002', NULL);

正确的方法是:

SELECT COUNT(DISTINCT name)

FROM CVE

WHERE name NOT IN (SELECT cveID FROM cve_sig WHERE cveID IS NOT NULL)

in

in后面的结果集有null,不影响!!!

SELECT COUNT(DISTINCT name)

FROM CVE

WHERE name IN (SELECT cveID FROM cve_sig WHERE cveID IS NOT NULL)
<think>好的,我需要确定com.mysql.jdbc.Driver对应的MySQL版本。根据提供的引用,首先查看引用[2]和引用[4],里面提到com.mysql.jdbc.Driver属于mysql-connector-java 5,而com.mysql.cj.jdbc.Driver是6及以上版本。接着引用[3]说明com.mysql.jdbc.Driver是早期版本的驱动,对应的是MySQL Connector/J 5.1.37之前。那么,对应的MySQL服务器版本应该与Connector/J的版本相关。通常,Connector/J的版本与MySQL服务器版本有一定的兼容性,比如Connector/J 5.x支持MySQL 5.x和部分早期8.x版本。因此,com.mysql.jdbc.Driver主要适用于MySQL 5.x系列,具体可能需要查看官方文档确认兼容性范围。此外,引用[3]提到字符集和JDBC特性差异,这也支持版本差异的结论。总结起来,com.mysql.jdbc.Driver对应的是MySQL 5.x及更早版本,而6.x驱动对应更高版本的MySQL。需要建议用户根据使用的Connector/J版本判断对应的MySQL服务器版本,并注意驱动类名的变更。</think>[逐步解答] 要确定`com.mysql.jdbc.Driver`对应的MySQL版本,需结合JDBC驱动版本和MySQL服务器版本的关联性分析: 1. **驱动类与Connector/J版本的对应关系** - `com.mysql.jdbc.Driver`是MySQL Connector/J **5.x**的默认驱动类[^2][^4]。 - 从Connector/J **6.0**开始(如mysql-connector-java 6+),驱动类改为`com.mysql.cj.jdbc.Driver`[^3]。 2. **Connector/J与MySQL服务器版本的兼容性** - Connector/J 5.x通常兼容MySQL服务器**5.1、5.5、5.6、5.7及部分8.0版本**。 - 例如,Connector/J 5.1.37支持MySQL 5.7,但连接MySQL 8.0时可能需要升级驱动或显式配置时区(如`serverTimezone=UTC`)。 3. **关键结论** - 若项目中使用`com.mysql.jdbc.Driver`,表明依赖的是**Connector/J 5.x**版本。 - 对应的MySQL服务器版本应为**5.x系列**(推荐5.5+),或通过配置兼容部分8.x版本。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值