189 8069 5689

怎么修改mysql时区 修改mysql数据库时间

技术分享 | MySQL:一文弄懂时区&time_zone

你还在被以下问题困扰吗:

成都创新互联公司是一家成都做网站、网站建设、外贸营销网站建设,提供网页设计,网站设计,网站制作,建网站,按需定制制作,网站开发公司,公司2013年成立是互联行业建设者,服务者。以提升客户品牌价值为核心业务,全程参与项目的网站策划设计制作,前端开发,后台程序制作以及后期项目运营并提出专业建议和思路。

MySQL 的安装规范中应该设置什么时区?

JAVA 应用读取到的时间和北京时间差了14个小时,为什么?怎么解决?

已经运行一段时间的业务,修改 MySQL 的时区会影响已经存储的时间类型数据吗?

迁移数据时会有导致时间类型数据时区错误的可能吗?

...

看完这篇文章,你能解决上面所有的疑惑。首先出场的是和时区相关的启动参数和系统变量。

如果要在 MySQL 启动时就指定时区,则应该使用启动参数: default-time-zone ,示例:

启动后我们可以看到控制时区的系统变量,其中 time_zone 变量控制时区,在MySQL运行时可以通过 set 命令修改(注意:不可以写在 my.cnf 中):

启动参数和系统变量的可用值遵循相同的格式:

system_time_zone 变量只有全局值没有会话值,不能动态修改,MySQL 启动时,将尝试自动确定服务器的时区,并使用它来设置 system_time_zone 系统变量, 此后该值不变。当 time_zone='system' 时,就是使用的这个时区,示例中 time_zone 就是 CST,而 CST 在 RedHat 上就是东八区:

概括一下就两点:

1. NOW() 和 CURTIME() 系统函数的返回值受当前 session 的时区影响

不仅是select now(),包括insert .. values(now())、以及字段的 DEFAULT CURRENT_TIMESTAMP 属性也受此影响:

2. timestamp 数据类型字段存储的数据受时区影响

timestamp 数据类型会存储当时session的时区信息,读取时会根据当前 session 的时区进行转换;而 datetime 数据类型插入的是什么值,再读取就是什么值,不受时区影响。也可以理解为已经存储的数据是不会变的,只是 timestamp 类型数据在读取时会根据时区转换:

关于时区所有明面上的东西都在上面了,我们前面提到的困扰就是在暗处的经验。

1. MySQL的安装规范中应该设置什么时区?

对于国内的业务了,在 my.cnf 写入 default-time-zone='+08:00' `,其他地区和开发确认取对应时区即可。

为什么不设置为 system 呢?使用系统时间看起来也是个不错的选择,比较省事。不建议的原因有两点:

2. JAVA应用读取到的时间和北京时间差了14个小时,为什么?怎么解决?

这通常是 JDBC 参数中没有为连接设置时区属性(用 serverTimezone 参数指定),并且MySQL中没有设置全局时区,这样MySQL默认使用的是系统时区,即 CST。这样一来应用与MySQL 建立的连接的 session time_zone 为 CST ,前面我们提到 CST 在 RedHat 上是 +08:00 时区,但其实它一共能代表4个时区:

JDBC在解析CST时使用了美国标准时间,这就会导致时区错误。要解决也简单:一是遵守上面刚说到的规范,对MySQL显示的设置'+08:00'时区;二是JDBC设置正确的 serverTimezone。

3. 已经运行一段时间的业务,修改MySQL的时区会影响已经存储的时间类型数据吗?

完全不会,只会影响对 timestamp 数据类型的读取。这里不得不提一句,为啥要用 timestamp?用 datetime 不香吗,范围更大,存储空间其实差别很小,赶紧加到开发规范中吧。

4. 迁移数据时会有导致时间类型数据时区错误的可能吗?

这个还真有,还是针对 timestamp 数据类型,比如使用 mysqldump 导出 csv 格式的数据,默认这种导出方式会使用 UTC 时区读取 timestamp 类型数据,这意味导入时必须手工设置 session.time_zone='+00:00'才能保证时间准确:

如何避免?mysqldump 也提供了一个参数 --skip-tz-utc ,意思就是导出数据的那个连接不设置 UTC 时区,使用 MySQL 的 gloobal time_zone 系统变量值。

其实 mysqldump 导出 sql 文件时默认也是使用 UTC 时区,并且会在导出的 sql 文件头部带有 session time_zone 信息,这样可以保证导 SQL 文件导入和导出时使用相同的时区,从而保证数据的时区正确(而导出的 csv 文件显然不可以携带此信息)。需要注意的是 --compact 参数会去掉 sql 文件的所有头信息,所以一定要记得: --compact 参数得和 --skip-tz-utc 一起使用。

安装完mysql,远程工具连接显示serverTimezone问题

连接出现The server time zone value '?й???????' is unrecogni异常。

方案:

打开mysql操作窗口,连接上mysql,设置timezone:

输入以下mysql指令:show variables like ‘%time_zone%';

命令: show variables like '%time_zone%';

默认的 time_zone = “SYSTEM”; 我们修改time_zone的值:set global time_zone = “+8:00”;

命令:set global time_zone = "+8:00";

然后在重新试一下客户端就可以连接成功了!

如何修改mysql 时区 为system

1。在mysql的命令模式下使用

mysql select CURTIME();

mysql select now();

看当前时间是否正确,可以看到mysql当前使用的是那一个时区的时间。

2。在mysql命令行中更改时区

mysql SET time_zone = '+8:00'; # 此为北京时,我们所在东8区

mysql flush privileges; # 立即生效

此时mysql时区已更改正确,与系统时区都使用为 Shanghai时间了。

#### 这种方法好像只能在终端上使用,退出终端后时间又会变成原来的,看来只能重启mysql了。

3。重启mysql也应没有问题,此时mysql会主动读取系统时间。

方法二:

如果mysql数据库可以重启,直接重启,mysql应可以立即主动读取系统时间,如果不行则更改mysql的配置文件(mysql.cnf)

在my.cnf的 [mysqld]区域中加上

default-time_zone = '+8:00' #此为北京时。

补充:

如果想临时解决时间显示问题,可以用php或其他语言动态修改下mysql的时区。

具体方法:

在mysql_connect()下使用mysql_query("SET time_zone = '+8:00'")。

这样可以在保证你不重启的情况下改变时区。但是mysql的某些系统函数还是不能用如:now()。

mysql修改和查看时区(十五)

1. 查看时区命令

2. GMT、UTC、DST、CST时区代表的意义

2.1 GMT:Greenwich Mean Time 

2.2 UTC: Coordinated Universal Time

2.3 DST: Daylight Saving Time

2.4 CST:Central Standard Time

3.  修改时区

3.1 仅修改当前会话的时区,停止会话失效(CET)

3.2 修改全局的时区配置


分享标题:怎么修改mysql时区 修改mysql数据库时间
文章出自:http://cdxtjz.cn/article/doippgi.html

其他资讯