| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> [刨根问底版]The server time zone value ‘?й???????‘ is unrecognized or represents more than one time zone. -> 正文阅读 |
|
[大数据][刨根问底版]The server time zone value ‘?й???????‘ is unrecognized or represents more than one time zone. |
目录一 、问题发生系统环境:JDK 1.8、mysql-connector-java 8.0.23(mysql驱动程序)、mysql数据库 8.0.28 代码如下:
在IDEA运行后,出现错误,如下图所示: 二、 问题解决报错信息中,包含了对解决问题方法的描述。
翻译:如果你想运用时区支持,必须配置服务器或JDBC驱动程序(通过’ serverTimezone '配置属性)来使用更具体的时区值。 解决方案一:配置服务器1. 临时配置重启服务器会失效。使用具有权限的(配置全局变量,可以是root用户)用户,登陆到mysql服务器,运行以下命令:
2. 永久配置在my.ini中添加配置项(Windwos系统中,my.ini文件位置:C:\ProgramData\MySQL\MySQL Server 8.0),重启服务器生效。
解决方案二:配置JDBC驱动程序通过serverTimezone配置连接的属性,即在url中添加serverTimezone=UTC参数。 另外,serverTimezone的值除了UTC外,还可以设置Asia/Shanghai、GMT%2b8(URL编码),把会话(也就是客户端与服务器的链接)的时区设置为东八区。 String url = "jdbc:mysql://localhost:3306/crashcourse?serverTimezone=Asia/Shanghai
JDBC的会话时区如果不配置,默认使用服务器的全局时区配置。 上述配置虽然不会报错,但是不会发挥作用。如果想要时区发挥作用还需要配置useTimezone参数。正确做法是 String url = "jdbc:mysql://localhost:3306/crashcourse?serverTimezone=Asia/Shanghai&useTimezone=true
关于serverTimezone取值的格式:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-connp-props-datetime-types-processing.html serverTimezone 只在客户端发挥作用,并不实际修改会话time_zone的值 JVM Connecter serverTimezone utc+9 server utc+8 底层 解决方案三:使用低版本驱动程序我觉得,严格来说,这不算是问题的解决方法,而是逃避问题的手段。如果你不想了解时区是什么及如何设置,像快点学习JDBC开发技术,这也是一种选择。但是,可能会存在软件版本之间的兼容问题。 由于mysql的java驱动程序,在版本6.0.0及以上,才要求必须配置时区,因此,可以使用6.0.0以下版本的mysql-connector-java.jar,例如、比较稳定的版本5.1.49 至此问题已经解决。网上大部分的解答也差不多就是上面总结的情况。 但是,当我查看一些高赞博文的评论时,发现有人和我存在一样的困惑:”时区是什么,为什么会有时区问题?“ 如果你也有这样的疑惑,请继续阅读下面的讲解。说实话,解决这个问题,两分钟都不需要,但是真正弄清楚问题的原因,需要花费很大努力。难能可贵嘛,加油,奥利给! 三、问题分析”The server time zone value ‘�й���??��’ is unrecognized“,服务器时区值’�й���??��’是无法识别的,那么,这个乱码的值是什么?如果解决了乱码问题,是否就不会出现这个问题了呢?这是我遇到这个问题时,脑海里最初的想法。 介绍上述内容需要了解一些基础知识。 1、时区系统变量服务器系统变量(system variables),表示服务器运行中使用到配置选项。例如,配置服务器的端口号、字符集等等。可以在my.ini文件中配置,有些系统变量是动态的(dynamic),也可以在运行时使用SET 语句更改,这使你能够修改服务器的配置项而无需重启,即可生效。另外,全局系统变量(global system variables)对与所以会话(指的是一个mysql客户端到服务器的连接)都生效,会话系统变量(session system variables)只对当前会话有效,不影响其他会话。 和时区相关的系统变量:
如果设置为SYSTEM,(每个需要时区计算的 MySQL 函数调用)都会调用系统库来确定当前系统时区。 注意,两者的区别,服务器系统时区和我们的客户端程序(例如,JDBC程序)没有直接关系,而服务器当前时区是与我们的客户端程序有密切关系,我们使用的时区就是服务器当前时区。就好像character_set_server和character_set_system一样,system的编码用于服务器系统内部的编码,而server才和数据库的编码有联系。因此,会着重介绍服务器当前时区time_zone 设置全局系统变量语法: 全局系统变量,对所有会话有效,如果会话不覆盖系统变量,默认使用它
设置会话系统变量语法:
timezone值可以以多种格式给出,但都不区分大小写:
查看系统变量语法:
variableName表示变量的名字,如果像查询时区系统变量,可以SELECT @@SESSION.time_zone; 另外,如果不知道变量的具体名字,也可以模糊查询
2、乱码的内容是什么首先,使用root用户登录到服务器,执行代码:
执行代码:
至此,我们清楚了乱码的内容是“中国标准时间”。 对此,你也许会产生怀疑,我说JDBC程序就是调用了msyql的库函数,返回值为“中国标准时间”,实际底层是这样做的吗?如何能直接说明乱码就是“中国标准时间”呢。我来证明一下。 执行代码: hex()获取表中字符数据项目的在数据库表中的底层编码,可以看到返回值为: (关于字符编码及乱码问题,可以参考这篇文章:《字符编码及乱码》,可以解决你日常遇到的所有乱码问题)
3. 为什么要使用时区先简单了解一下时区,全球被划分为24个时区,每差一个时区,区时相差一个小时。时区转换规则,“东加西减”。 例如、中国在东八区,日本在东九区,我现在的时间是22:30,那么日本现在是23:30。 时区表示方式:
当然,从上图我们也可以知道,不同的国家或者地区可以处于相同的时区,为了方便使用,不同国家或地区可以根据自己的需要对相同时区定义不同的名字。例如、我们中国定义东八区为China Standard Time,中国台湾定义东八区为Taipei Standard Time。 (Windows10系统,通过在命令行窗口运行命令: 假设,我们建立了一个发布国际新闻的网站,首先建立一张表保存新闻信息,content字段存储新闻的内容,instant字段存储发布新闻的时间。
为了避免混乱,可以打开两个命令行窗口。 一位中国记者上传了一条新闻,设置了会话时区为东八区,然后上传了一条新闻
中国新闻媒体会这样报道新闻:
然而,对于第二件事,发生的时间时4月5日,0点5分, 4. 如何在mysql驱动程序中设置时区上文介绍了时区的作用,并讲解了mysql命令行设置时区的方式,接下来将详细介绍如何通过建立连接的url中的参数,指定时区的相关配置。 let’s go~ 未完待续… 现在时间23:28,在不睡就完了。。。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 5:52:47- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |