mysql安装后如何设置字符集和排序规则_mysql编码环境设置
发布时间 - 2026-01-31 00:00:00 点击率:次MySQL 5.7+ 默认字符集不是 utf8mb4,而是 latin1;必须在 my.cnf 的 [client]、[mysql]、[mysqld] 三段统一配置 utf8mb4,并显式指定建库建表字符集及应用连接参数,否则仍会导致乱码。
MySQL 5.7+ 启动时默认字符集不是 utf8mb4?
是的,默认不是。MySQL 5.7 默认 character_set_server 是 latin1,collation_server 是 latin1_swedish_ci,哪怕你建库时指定了 utf8mb4,新创建的数据库、表、列仍可能继承服务端默认值,导致插入中文乱码、emoji 存不进去、ORDER BY 排序异常等问题。
根本原因在于:MySQL 的字符集生效是分层的(服务器 → 数据库 → 表 → 列),且客户端连接时若未显式指定,会按服务端默认值协商编码,造成「看起来能存,实际传输过程已损坏」。
- 检查当前设置:
SHOW VARIABLES LIKE 'character\_set\_%';和SHOW VARIABLES LIKE 'collation\_%';
- 临时修改(重启失效):
SET GLOBAL character_set_server = 'utf8mb4'; SET GLOBAL collation_server = 'utf8mb4_unicode_ci'; - 真正生效必须写入配置文件并重启
mysqld
my.cnf 中该在哪几个段落写 charset 配置?
必须同时覆盖 [client]、[mysql]、[mysqld] 三个段落,缺一不可。只改 [mysqld] 只影响服务端,客户端(如 mysql 命令行、PHP PDO)仍可能用错编码握手。
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' skip-character-set-client-handshake = FALSE
-
init_connect确保普通用户连接后自动执行SET NAMES,但对root或带SUPER权限用户无效(安全限制) -
skip-character-set-client-handshake = FALSE强制服务端以配置值响应客户端的编码协商请求(默认为 TRUE,即允许客户端“自说自话”) - 注意:MySQL 8.0+ 已废弃
init_connect对 SUPER 用户的限制,但兼容性起见仍建议保留
建库建表时还要再指定 utf8mb4 吗?
要,而且必须显式指定。即使服务端已设为 utf8mb4,新建数据库若不声明,仍可能继承旧默认值(尤其升级或迁移环境时)。
- 创建数据库:
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 创建数据表:
CREATE TABLE t (c VARCHAR(100)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - 已有表转换:
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;(注意:该语句会重建表,大表慎用) - 特别注意
VARCHAR字段长度:utf8mb4 下每个字符最多占 4 字节,InnoDB 单行最大 65535 字节限制下,VARCHAR(255)实际占用字节数翻倍,极端情况下可能触发Row size too large错误
PHP/Python 连接时为什么还是乱码?
因为客户端驱动没传对编码参数,服务端配置只是基础,连接时的「协商」环节才是关键。
- PHP mysqli:
$mysqli = new mysqli($host, $user, $pass, $db); $mysqli->set_charset('utf8mb4');或在 DSN 中加;charset=utf8mb4 - PHP PDO:
new PDO($dsn, $user, $pass, [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4']); - Python PyMySQL:
conn = pymysql.connect(..., charset='utf8mb4') - Node.js mysql2:
{ charset: 'utf8mb4' }选项必须显式传入 - 错误典型表现:
、???、插入成功但 SELECT 出来是空格或问号——大概率是连接层编码没对齐
# mysql
# php
# python
# js
# 前端
# node.js
# node
# 编码
# 字节
# 中文乱码
# 配置文件
# mysql安装
# select
# mysqli
# pdo
# 继承
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建高效可靠的建站解决方案?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
如何快速搭建虚拟主机网站?新手必看指南
如何快速登录WAP自助建站平台?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
canvas 画布在主流浏览器中的尺寸限制详细介绍
如何在阿里云购买域名并搭建网站?
如何做网站制作流程,*游戏网站怎么搭建?
如何在景安服务器上快速搭建个人网站?
Laravel怎么清理缓存_Laravel optimize clear命令详解
音乐网站服务器如何优化API响应速度?
jquery插件bootstrapValidator表单验证详解
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何在建站宝盒中设置产品搜索功能?
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Firefox Developer Edition开发者版本入口
如何在云主机上快速搭建多站点网站?
Laravel如何发送系统通知?(Notification渠道示例)
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
SQL查询语句优化的实用方法总结
Java解压缩zip - 解压缩多个文件或文件夹实例
原生JS获取元素集合的子元素宽度实例
手机网站制作与建设方案,手机网站如何建设?
javascript如何操作浏览器历史记录_怎样实现无刷新导航
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
如何快速上传自定义模板至建站之星?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
C++时间戳转换成日期时间的步骤和示例代码
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
微信h5制作网站有哪些,免费微信H5页面制作工具?
油猴 教程,油猴搜脚本为什么会网页无法显示?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
C#如何调用原生C++ COM对象详解
浅述节点的创建及常见功能的实现
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
如何用PHP快速搭建高效网站?分步指南
Python面向对象测试方法_mock解析【教程】
javascript中的try catch异常捕获机制用法分析
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel如何实现用户密码重置功能?(完整流程代码)
海南网站制作公司有哪些,海口网是哪家的?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
php json中文编码为null的解决办法
香港服务器网站推广:SEO优化与外贸独立站搭建策略
使用豆包 AI 辅助进行简单网页 HTML 结构设计
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
微信公众帐号开发教程之图文消息全攻略


