前言
由于本学期开始数据库和Java的学习,我便开始下载IntelliJ IDEA。之所以会选择这款编辑器,一是因为它的功能强大,二就是它可以与多种数据库接,直接可以在IntelliJ IDEA上面编写SQL指令。在我看来是很方便的。
经过
当我按照网上的方法一步步下载,安装,破解IntelliJ IDEA和MySQL。虽然中间有一些问题,但最终还是把IntelliJ IDEA和MySQL安装好了。但是却在
IntelliJ IDEA连接MySQL之后出现了问题。
上网查的结果大都是说时区设置错误;
于是在MySQL中改动时区设置,结果还是显示连接不上。一个人从早上改到晚上,结果还是不行。 一切没有办法的时候,我找到我的班主任。班主任很耐心帮我解决了这个问题。
结果
问题有两个:
- 连接的数据库,事先并没有建立。
而这个问题连接检测并不会直接提示出来,显示问题是时区配置问题。一直使我误以为是时区设置错误。出现这个问题的原因是:我不熟悉IntelliJ IDEA的操作,错误的以为Database后面填的是自己要建立数据库名,实际上却是IntelliJ IDEA要连接的数据库名。
- 时区没有设置(serverTimezone为空)
当我改为一个已经建立的数据库时,依然出现和开始相同的问题。
于是又在MySQL中改动时区设置,结果还是显示连接不上。
解决办法:
在Advanced下的serverTimezone设置成Asia/Shanghai
最终连接成功
在我以为这事终于可以放下的时候,班主任老师告诉我解决问题不能局限于表面,连接正常只是表面上这个问题解决了。但是为什么这样就能连号,换成别的时区会有什么影响。于是让我做了一个测试。
1.将idea数据库连接serverTimezone项还原为初始状态(空),测试数据库连接
2.确认MySQL使用的时区
3.如果不能确认,手动将MySQL time_zone设置为北京时间(+08:00),测试数据库连接
4.将MySQL time_zone设置为UTC(+00:00),测试数据库连接
以上测试可得到何种结论?
5.将idea数据库连接serverTimezone项设置为UTC,测试数据库连接
6.将MySQL time_zone设置为北京时间(+08:00),测试数据库连接
7.将idea数据库连接serverTimezone项设置为Asia/Shanghai,测试数据库连接
8.将idea数据库连接serverTimezone项设置为任意时区(http://www.360doc.com/content/19/0806/11/39194723_853278521.shtml),测试数据库连接
以上测试可得到何种结论?
9.将idea数据库连接serverTimezone项设置为UTC,将MySQL time_zone设置为北京时间(+08:00),完成数据库写入(带插入时间)
查询数据,有何现象?
这一系列的测试做下,我还是有点懵。尤其是在MySQL中的操作,我常常怀疑自己做的到底对不对。
班主任老师又给我耐心的讲了这个测试。
得到的结果是:
- serverTimezone项若为空,连接就会失败。原因就是
MySQL规定serverTimezone项不能为空。
- serverTimezone项只要不为空,无论是否与MySQL时区相匹配,连接都可以成功。
- 但是不使用Asia/Shanghai时间和不把MySQL中的时区(+8:00)会使得数据库返回的时间与当前时间相差8小时。
将idea数据库连接serverTimezone项设置为UTC,将MySQL time_zone设置为北京时间(+08:00),完成数据库写入
1 CREATE TABLE class_member(
2 id INT(2) AUTO_INCREMENT PRIMARY KEY,
3 name VARCHAR(20) NOT NULL UNIQUE,
4 age TINYINT(2) NOT NULL,
5 CreateTime datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
6 modify_time timestamp
7 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
8 );
9 INSERT INTO class_member(id, name, age)
10 VALUES ('101','刘丽','13'),
11 ('102','王一','14'),
12 ('103','王二','15'),
13 ('104','王三','16'),
14 ('105','刘二','14'),
15 ('106','李东','15');
16 SELECT *
17 FROM class_member;
18 update class_member set age = 16 where name = '王一';
19 SELECT *
20 FROM class_member;
21
22 SELECT *
23 FROM class_member;
24 SELECT *
25 FROM class_member;
26 update class_member set age = 16 where name = '王二';
27 INSERT INTO class_member(id,name,age)VALUES ('107','张小明','17');
28 show variables like '%time_zone%';
29 set time_zone = '+8:00';
30 SELECT *
31 FROM class_member;
32 update class_member set age = 17 where name = '王一';
前面是北京时间,后面是UTC。
至此这个问题终于告一段落。
补充:
、当字段定义为timestamp,表示该字段在插入和更新时都不会自动设置为当前时间。他会显示为NULL,并且修改数据后返回的时间依然是NULL。
、当字段定义为timestamp DEFAULT CURRENT_TIMESTAMP,表示该字段仅在插入且未指定值时被赋予当前时间,再更新时且未指定值时不做修改。因此这个可以用来显示表的创建时间。就是首次创建的时间。
、当字段定义为timestamp ON UPDATE CURRENT_TIMESTAMP,表示该字段在插入且未指定值时被赋值为"0000-00-00 00:00:00",在更新且未指定值时更新为当前时间。
、当字段定义为timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示该字段在插入或更新时未指定值,则被赋值为当前时间。这个时间才可以捉到修改数据及时得到修改时间。
执行一次数据修改。发现果然如此,DEFAULT CURRENT_TIMESTAMP定义的时间未变,ON UPDATE CURRENT_TIMESTAMP定义的时间发生改变。