MySQL时区需在my.cnf的[mysqld]段用default-time-zone显式配置并重启生效,server_time_zone为只读且由启动时决定;字符集须同时设character-set-server和collation-server,并确保连接与存量对象同步更新。
MySQL 启动时如何正确设置时区(server_time_zone)
MySQL 的时区不是靠操作系统时区自动同步的,
默认是
,意味着它会读取
mysql
d 启动时的系统时区(不是当前 shell 的
环境变量),且启动后不可动态修改。如果你看到
和系统时间对不上,大概率是这里没设对。
最稳妥的方式是在配置文件
或
的
段下显式指定:
或用命名时区(需系统支持):
注意:
影响的是新连接的
会话变量,默认值;而
是只读的服务器级时区,由
或启动时推导决定,不能 SET
改完必须重启 mysqld,
只影响后续新连接的默认会话时区,不改变
验证方式:
—— 三个值要分清:前两个可设,最后一个只读且等于启动时的系统时区或
值
哪些 MySQL 系统参数必须在 my.cnf 里配,不能用 SET GLOBAL
很多关键参数属于「只读启动参数」,运行时无法修改,比如内存类、日志路径、字符集基础项。强行
会报错
。
典型只读参数:
、
、
、
、
、
(MySQL 5.7+ 可动态调高但不能低于当前活跃连接数)、
(8.0.22+ 支持在线调整,但有上下限限制)
、
、
这类可以
,但仅对之后的新连接生效,当前连接不变
修改
后记得检查语法:
,避免重启失败
character-set-server 和 collation-server 配置陷阱
光设
不够,MySQL 5.7+ 默认
是
,但这个排序规则不区分 emoji 和部分四字节字符的比较逻辑,推荐用
(8.0+)或
(5.7)。更关键的是:如果客户端连接时没声明
,或者建表没指定
,依然可能存成
。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
my.cnf 必须同时写两行:
连接字符串里要显式加
(如 Python 的 pymysql、Java 的 JDBC)
已有库/表需手动转换:
,表和字段同理,否则配置只是「默认」,不改变存量
验证是否生效:
,重点看
和
配置修改后为什么 SHOW VARIABLES 不立即反映?
因为
显示的是当前会话生效的值,而很多参数(尤其是只读参数)修改后必须重启 mysqld 才能加载。即使你改了
并执行了
,也有可能没真正加载到新配置。
确认 mysqld 实际读取的是哪个配置文件:
,常见路径还有
、
,优先级高于 /etc/my.cnf
检查启动时有没有警告:
,留意
或
提示(比如老版本用
,新版本已废弃)
某些参数(如
)支持动态设置,但若在 my.cnf 里写了错误值(例如多加了个空格),会导致整个配置段被跳过,而不是只忽略那一行
MySQL 的环境参数看似简单,但时区、字符集、只读参数这三块最容易在部署后暴露问题——不是改了就生效,而是得看它从哪读、对谁生效、改完有没有真正加载。尤其跨版本升级时,参数名和默认行为常有变化,别信文档,先
看实际支持什么。
server_time_zoneSYSTEMTZSELECT NOW()/etc/my.cnf/etc/mysql/my.cnf[mysqld][mysqld]
default-time-zone = '+08:00'default-time-zone = 'Asia/Shanghai'default-time-zonetime_zoneserver_time_zonedefault-time-zoneSET GLOBAL time_zoneserver_time_zoneSELECT @@global.time_zone, @@session.time_zone, @@global.system_time_zone;default-time-zoneSET GLOBALERROR 1238 (HY000): Variable 'xxx' is a read only variableinnodb_data_home_dirdatadirlog_bincharacter-set-servercollation-servermax_connectionsinnodb_buffer_pool_sizewait_timeoutmax_allowed_packetsort_buffer_sizeSET GLOBALmy.cnfmysqld --defaults-file=/etc/my.cnf --validate-configcharacter-set-server = utf8mb4collation-serverutf8mb4_general_ciutf8mb4_0900_as_csutf8mb4_unicode_cicharset=utf8mb4CHARACTER SETlatin1character-set-server = utf8mb4
collation-server = utf8mb4_0900_as_cs?charset=utf8mb4ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_as_cs;SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';character_set_servercollation_serverSHOW VARIABLESmy.cnfsystemctl restart mysqlmysqld --verbose --help | grep "Default options"/usr/my.cnf~/.my.cnfsudo journalctl -u mysql -n 50 --no-pagerunknown variabledeprecateddefault-character-setsql_modemysqld --help --verbose