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_serverlatin1collation_serverlatin1_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 出来是空格或问号——大概率是连接层编码没对齐
实际部署中最容易漏掉的是客户端配置段落和应用层连接参数,服务端改完以为万事大吉,结果应用一连就出问题。字符集这事,得从 my.cnf、建表语句、连接初始化、甚至前端 HTTP 头(Content-Type charset)全链路对齐才稳。


# 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精度调整与放大细化操作【攻略】  微信公众帐号开发教程之图文消息全攻略