简单明白彻底解决 MySQL 中文编码问题

数学工具箱:Clarke与Park变换 本文详细解析了FOC(磁场定向控制)中的核心数学工具——Clarke变换与Park变换。首先阐述了坐标变换的必要性:将复杂的三相交流系统简化为直流系统,便于精确控制。Clarke变换将三相静止坐标系转换为两相静止坐标系,减少变量数量;Park变换进一步将两相静止坐标系转换为两相旋转坐标系,实现交流量到直流量的转换。文章提供了两种变换的数学公式、物理意义图解及C语言实现代码,并简要介绍了逆变换过程。这些变换为电机控制提供了关键的数学基础,后续将结合GD32F303的FPU特性进行优化实现。 阅读详情

1. 问题重现

mysql> create database school;
mysql> use school;
mysql> create table student(name varchar(10));
mysql> insert into student values("Clarke");
mysql> select * from student;
+--------+
| name   |
+--------+
| Clarke |
+--------+
mysql> insert into student values("唐三");

# 插入中文失败
ERROR 1366 (HY000): Incorrect string value: '\xE5\x94\x90\xE4\xB8\x89' for column 'name' at row 1

2. 分析和解决

2.1 数据库编码设置

2.1.1 查看 MySQL 程序编码设置
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                    |
| character_set_connection | latin1                    |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                    |
| character_set_server     | latin1                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

可以看到,设置里有很多的编码设置是 latin1,这个编码是无法正确显示中文的,如果你的设置也是这样,这就是导致中文编码问题的可能原因。

关于这些设置的含义:

optiondesc
character_set_client客户端使用的字符编码,如果客户端连接时没有设置,或者服务端已配置为忽略客户端的设置
character_set_connection客户端设置连接数据库时的字符编码,如果客户端没有指明,则连接数据库使用该设置的编码
character_set_database当前选中数据库的默认字符编码,如果没有选中数据库(use ),则和 character_set_server 的值一致
character_set_filesystem文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
character_set_results数据库给客户端返回时使用的编码格式,如果客户端连接时没有指明,则使用该编码
character_set_server数据库服务器默认编码格式,创建数据库时默认使用
character_set_system数据库系统使用的编码格式,这个值一直是utf8,不需要设置,它是为存储系统元数据的编码格式
character_sets_dir这个变量是字符集安装的目录

更多说明:MySQL doc - 5.1.7 Server System Variables

2.1.2 修改编码设置

编码设置中我们需要关注的是下面 5 个字符编码设置:

# 服务端相关
character_set_server
character_set_database #当前选中数据库的编码,这个设置不需要手动修改​

# 客户端相关
character_set_client
character_set_connection
character_set_results

修改编码设置的方式有三种。

方式1: session 范围修改

mysql> set character_set_server=utf8mb4

建议使用 utf8mb4 编码而不是 utf8,因为 MySQL 的 utf8 编码有点小问题,可以自行百度 MySQL 中 utf8 和 utf8mb4 的区别

这种修改方式是 session 范围的,也就是当前的 MySQL 连接结束后,设置就失效了。

其他几个编码设置也一样修改。

方式2: global 范围修改

mysql> set global character_set_server=utf8mb4

global 范围下的修改,重新连接依然有效,直到 MySQL 服务端重启。

方式3: 修改配置文件

想要编码设置在 MySQL 服务端重启后依然生效,可以修改配置文件。

不同平台的配置文件位置不一样,可以通过下面命令查看:

➜  ~ mysql --verbose --help | grep my.cnf

/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

更多说明: MySQL 官方文档:4.2.2.2 Using Option Files

除了~/.my.cnf文件是用户级别的外,其他几个位置都是系统级别的,如果该位置没有my.cnf文件,就新建一个文本文件,命名为 my.cnf

windows 系统下,这个文件叫 my.ini

my.cnf文件中添加以下内容:

[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci 
[client]
default_character-set=utf8mb4

更多信息参考: A.11 MySQL 8.0 FAQ: MySQL Chinese, Japanese, and Korean Character Sets

配置项说明:

  • character-set-server 设置影响 character_set_server 的值,character_set_database 的值在未选中当前数据库的情况下下,默认跟随 character_set_server 的值。

  • default-character-set 影响 character_set_client, character_set_connection, character_set_results 三者的值。

在 MySQL 连接终端中执行 SET NAMES <charset>也是影响的 character_set_client, character_set_connection, character_set_results 三者的值

  • collation_server 影响 orderby 的排序结果,建议设置 character-set-server 的同时也要设置

关于 character_set_server 和 collation_server: MySQL doc - sysvar_character_set_server

修改配置文件后重启 MySQL,再查看下编码设置,

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

可以看到已经生效了,5 个相关设置已经修改为 utf8mb4。

三种修改方式,优先选择修改配置文件,其次的选择或者想要灵活设置的话,可以在终端会话中设置。

2.2 已创建的数据库的编码

如果上面的配置已经修改完成,可能仍然有中文编码问题,因为对于已经创建完成的数据库和表,它的编码在创建时已经确定了,前面的配置项(character_set_server)已经不能影响了,需要逐个修改相应的数据库,表,列。

2.2.1 具体数据库的编码

查看完整的数据库创建语句:

mysql> show create database school;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| school   | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+

可以看到数据库 school 的默认编码仍然是 latin1,改起:

mysql> alter database school character set 'utf8mb4';

mysql> show create database school;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| school   | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+--------------------------------------------------------------------+
2.2.2 表的编码

在前一节,数据库 school 的默认编码已经修改为 utf8mb4,接下来看数据表的默认编码:

mysql> show create table student;
+---------+---------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                      |
+---------+---------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
  `name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------------------------------------+

看到数据表 student 的默认编码仍然是 latin1,再改起:

mysql> alter table student character set 'utf8mb4';
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table student;
+---------+-------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                            |
+---------+-------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
  `name` varchar(10) CHARACTER SET latin1 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+---------+-------------------------------------------------------------------------------------------------------------------------+
2.2.3 列的编码

在上一节可以看到,数据表 student 的默认编码已经修改为 utf8mb4,但是列 name 的编码还是 latin1,改起!

mysql> alter table `student` change `name` `name` text character set 'utf8mb4';
Query OK, 1 row affected (0.04 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> show create table student;
+---------+--------------------------------------------------------------------------------+
| Table   | Create Table                                                                   |
+---------+--------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
  `name` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+---------+--------------------------------------------------------------------------------+

到这里,对于已经存在的数据库,修改完成,再插入中文试试:

mysql> insert into student value("昊天");
Query OK, 1 row affected (0.00 sec)

mysql> select * from student;
+--------+
| name   |
+--------+
| Clarke |
| 昊天   |
+--------+
2 rows in set (0.00 sec)

成功!到此,中文编码的问题就解决了。

2.3 防御性编码

为了防止意外的情况发生,我们可以采取更健壮的防御性编码的方式,哪怕数据库服务端的编码设置不正确,我们仍然可以插入中文数据。

具体就是在创建数据表的时候指定默认编码:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

# 指定存储引擎,编码,排序规则
mysql> create table course(name varchar(32)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into course value('高数');
Query OK, 1 row affected (0.01 sec)

mysql> select * from course;
+--------+
| name   |
+--------+
| 高数   |
+--------+
1 row in set (0.00 sec)

或者直接在创建数据库的时候就指定编码:

mysql> create database school DEFAULT CHARACTER SET utf8mb4;

3. 总结

解决 MySQL 中文编码问题的步骤:

  1. 查看数据库编码设置

  2. 修改编码设置,在终端中修改设置项,或者修改配置文件 my.cnf 以永久生效

  3. 对于之前创建的数据库,修改数据库,数据表,数据列的默认编码

最佳实践:防御性编码,在数据库创建语句中指定默认编码。

参考:

MySQL 5.7 官方文档

数字孪生通信层开发:C#实现OPC UA到Unity3D的实时数据映射(2026年工业级实战指南) (西门子数字孪生总监):“在产线上,50ms的延迟意味着1%的设备误操作率。2026年,通信层不是‘工具’,是数字孪生的‘生命线’。 阅读详情

相关推荐

深入Mysql charset+解决方法

结合mysql手册中的解释,用具体的操作和例子,旨在了解mysql的字符编码机制及乱码问题的解决

关于MySQL的text类型数据导出乱码问题的解决

最近导出MySQL数据库表格时遇到了一个问题,即导出的csv文件有乱码,追查发现原来是text类型数据出现错误。 图一 表设计 图二 表内容 图三 导出的csv文件,编码方式已经设置为utf-8了,但是还是不行 解决方法: 设置后导出的csv文件就不会有问题了 最后补充一下varchar 、 char 和text的区别: ① varchar与char两个差不多,只是范围不同,varcahr最大可设置为65535,char最大可设置为255,若内容没达到设...

weixin_52358523的博客 954

ANSYS空调响应谱分析案例.zip

ANSYS空调响应谱分析案例

mysql修改乱码问题(中文编码的修改)

1. 查看编码 1.查看数据库编码 \s # 会发现有各种编码 Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 2. 修改未创建库的编码 # 1.打开配置文件 vim /etc/my.cnf # 2.修改配置文件 # 插入(已经有一个mysqld了) [mysqld] character-set-s

python_web全栈 3857

mysql text utf8mb4_MySQL 编码为 utf8mb4 的详细步骤

这是我们的,忘记原文在哪里了。desc "Database related tasks"namespace :database dodesc "Convert to utf8mb4"task convert_to_utf8mb4: :environment doconnection = ActiveRecord::Base.connectiondatabase = connection.curre...

weixin_33838871的博客 679

Mysql数据库编码问题 (修改数据库,表,字段编码为utf8)

修改数据库字符集为UTF8经常遇到的问题: 1.修改my.ini配置文件(MySQL配置文件) 2.修改数据库字符集 3.修改表字符集 4.修改列字符集

m0_65391975的博客 3951

修改MySQL数据库编码以支持中文

要修改MySQL的编码设置,我们需要编辑MySQL的配置文件。在某些情况下,我们可能需要修改MySQL的编码设置以支持中文字符的存储和检索。通过修改MySQL的编码设置,我们可以使其支持中文字符的存储和检索。主要步骤包括确定当前编码设置、修改配置文件、修改数据库和表的编码,并验证修改是否生效。这将将MySQL服务器的默认字符集设置为"utf8mb4",并将排序规则设置为"utf8mb4_unicode_ci"。"utf8mb4"是一种支持完整的Unicode字符集的编码,它可以正确地存储和处理中文字符。

TeiGradient的博客 944

mysql 可逆编码,简单明白彻底解决 MySQL 中文编码问题

简单明白彻底解决 MySQL 中文编码问题1. 问题重现mysql> create database school;mysql> use school;mysql> create table student(name varchar(10));mysql> insert into student values("Clarke");mysql> select * fro...

weixin_31232695的博客 288

mysql share 字体 中文_简单明白彻底解决 MySQL 中文编码问题

1. 问题重现mysql> create database school;mysql> use school;mysql> create table student(name varchar(10));mysql> insert into student values("Clarke");mysql> select * from student;+--------+|...

weixin_35645652的博客 218

简单明白彻底解决 MySQL 中文编码问题,2024年最新2024年大厂软件测试面经

解决 MySQL 中文编码问题的步骤:1.查看数据库编码设置2.修改编码设置,在终端中修改设置项,或者修改配置文件 my.cnf 以永久生效3.对于之前创建的数据库,修改数据库,数据表,数据列的默认编码最佳实践:防御性编码,在数据库创建语句中指定默认编码。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)一个人可以走的很快,但一群人才能走的更远!

2401_84297944的博客 432

python 中文编码_python读写数据的中文编码问题

使用python读写中文的时候,编码问题总是让我们这些半路出家的人很是痛苦。博主最近在写两个GUI软件的时候就被编码问题折腾得够呛,因此,特地分享一下在使用python编程过程中的中文编码问题。书写python脚本的时候,如果你想在程序/脚本中加入中文元素,在脚本顶部加上 #coding=gbk或者# coding=utf8即可解决。如果是想将中文作为参数,则使用u‘中文’将中文编码为unicod...

weixin_39946364的博客 217

中文编码问题困扰

这星期碰到中文编码问题。我的开发环境为 Linux、Resin、Mysql。其实是个比较简单的东西,从表单提交输入,然后保存到数据库中。结果发现部分字符出现“?”的乱码。比如输入的是“人事处”,从数据库读出在页面上显示的时候变成“人事??”。还以为jsp页面编码设置的问题,查了了半天也没发现问题。在论坛里问了也没有得到更好的建议,后来用google搜到了一些线索,有人提到Mysql数据库连接的编

BlueAnts Peronal Blog 1607

python mysql 编码方式,Python Mysql中文编码

解决编码问题之前需要了解编码基础知识:1、编码与解码;2、常用编码有哪几种;3、中文在不同编码下的情况;【解决中文编码问题,最简单方法是统一编码】关键在于这个“统一”可能存在的位置:1、编辑器编码;2、python运行编码;3、print输出编译器编码;4、存储Mysql数据库编码;链接数据库Connect的编码;5、读取外调文件、文件本身编码;需要弄明白,现在编码的过程中list/dict/中使...

weixin_36347133的博客 398

mysql 中文编码选择,Mysql中文乱码问题之分析

Mysql中文乱码问题之前被mysql中总是出现中文乱码搞得云里雾里,在网上也搜了些相关资料,可结果更让我觉得字符集的转换是相当复杂,甚至有了抵触心理,不过还好在最后搜到几篇经典的文章,经过研读总算明白过来!好文章,不敢独享,现将文章稍作整理与大家分享。字符集基本概念:http://home.phpchina.com/space.php?uid=57965&do=blog&id=1...

weixin_28812943的博客 215

php中文编码问题,php的中文编码问题

一、页面编码1. 使用 标签设置页面编码这个标签的作用是声明客户端的浏览器用什么字符集编码显示该页面,xxx可以为GB2312,GBK,UTF-8(和MySQL不同,MySQL是 UTF8)等等。因此,大部分页面可以采用这种方式来告诉浏览器显示这个页面的时候采用什么编码,这样才不会造成编码错误而产生乱码。但是有的时候我们会发现有了这句还是不行,不管xxx是哪一种,浏览器采用的始终都是一种编码,这...

weixin_32557949的博客 180

mysql乱码、字符集设置问题

排查mysql客户端中出现中文乱码的各种可能的原因。

aumonnn的博客 6451

通过my.ini修改mysql默认编码为UTF-8

mysql汉字乱码的原因 mysql默认的编码是Latin1是I-8859-1的别名,但Latin1是不支持汉字的,所以要将其改为UTF-8或GBK 1.关闭mysql服务器,这个很重要。 2.通过my.ini设置mysql数据库的编码 在mysql数据库的安装根目录下找到my.ini,例:C:\Program Files\MySQL\MySQL Server 5.5 将其复制到桌面

°还未来的博客 1万+

mysql 的charset是什么 有哪些?

MySQL 的字符集(charset)用于定义存储文本数据时使用的编码。字符集决定了可以在表或列中存储哪些字符,以及如何存储。

qq_21514303的博客 1413

MySQL数据库的字符编码问题

数据库的编码格式 查看数据库编码格式:show variables like '%character%' 修改数据库编码格式:set character_set_database = 'utf8' 修改MySQL客户端编码格式:set names utf8 关于MySQL 5.7 Command Line Client和MySQL 5.7 Command Line Client - Unicode 个人理解:这是两个不同的MySQL客户端,前者编码格式为latin1,不支持UTF8编码(即使将编码格式设

qq_41131223的博客 539

mysql中文乱码,无法插入中文的解决办法总结

有6个关键点使用字符 clinent connection database results server system 可以通过在mysql控制台下输入:show variables lilke ‘character_set_%’;查看   mysql4.1以后版本都支持多字符集的支持,但是安装默认的字符集竟然是latin1这个瑞典文,所以很多人想安装discuz等论坛为gbk、utf-

菜鸟果冻 755
上一篇: Android Gradle插件用户指南(译)
clarketang
博客等级 码龄19年 26粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值