my.ini位置:C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

my.ini116行附近添加(或者在[mysqld]后面任意位置,比如最后一行):character-set-server=utf8

 

 

然后重启mysql

问题现象:

这个问题我查了2天,找到的答案很多,我的问题分为两个:

第一个是通过mybatis插入的中文,mybatis查询出来显示为问号?;

第二个是,通过mybatis插入查询中文正常后,通过navicat看是问号?;

还有一个隐藏的问题是通过mybatis插入的中文,mybatis查询出来是乱码,我无法复现。

第一个问题的解决方法是修改C:\ProgramData\MySQL\MySQL Server 5.7\my.ini中的character-set-server=utf8,

# The default character set that will be used when a new schema or table is
# created and no character set is defined
# character-set-server=

解释下,character_set_server 是默认的内部操作字符集

Mysql字符集设置 - Johney - 博客园

字符集转换流程

关于MySQL中的8个 character_set 变量说明_小异常的博客-CSDN博客_character_set_system

这是修改前后使用SHOW VARIABLES LIKE 'character%';命令,在dos命令行下查询字符集设置结果的对比:

修改前:注释掉character-set-server=,

mysql> show variables like 'charac%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database   | latin1                                                  |
| character_set_filesystem | binary                                                  |
| character_set_results    | gbk                                                     |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)

 

 

修改后:添加character-set-server=utf8并重启mysql服务

mysql> show variables like 'charac%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | gbk                                                     |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)

 

第二个问题是因为navicat设置有误,我的navicat版本是15.0.12

解决方法是编辑连接

打卡高级选项卡,将编码改为自动(注意这里与较早的navicat版本不同,老版navicat是在连接属性中勾选使用MYSQL字符集)

 

 

 关于Navicat和MYSQL字符集不统一出现的中文乱码问题_fenfei12138的博客-CSDN博客_navicat乱码中文

navicat显示中文为问号_mawei7510的博客-CSDN博客_navicat显示中文是问号

隐藏的问题可能是客户端、连接、结果的字符集设置有误,如果有复现这个问题的,请提醒我补充下。

– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集

通过命令行插入中文,然后用select语句查询,在命令行下查询显示为乱码,在navicat工具下显示为???

 

检查数据库、表字符集设置,均为utf8

 

mysql> show variables like 'character_set_%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | latin1                                                  |
| character_set_connection | latin1                                                  |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | latin1                                                  |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.05 sec)


 

mybatis配置中设置unicode和charset可有可无:

按照mybatis教程应该设置为:
<property name="url" value="jdbc:mysql://localhost:3306/mybatis2?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
实际设置可以删除:useUnicode=true&characterEncoding=UTF-8,只保留如下:
url=jdbc:mysql://localhost:3306/mybatis2?useSSL=false

 mybatis自动/默认使用Unicode和utf-8

有参考价值的文章:

Mysql字符集设置 - Johney - 博客园

关于MySQL中的8个 character_set 变量说明_小异常的博客-CSDN博客_character_set_system

这两篇文章写的是基本概念。如果看了大量的博客还是感觉很糊涂,应先理清下概念。

MyBatis操作MySQL中文乱码问题_qdzeac的专栏-CSDN博客_mybatis查询中文乱码

从这篇文章了解到每个字段可以单独设置字符集。 

CREATE TABLE `buyerUser` (

 `U_buyer` int(11) NOT NULL AUTO_INCREMENT,

 `Ub_poptype` int(11) DEFAULT NULL,

 `Ub_popularrize` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULTCHARSET=utf8 PACK_KEYS=0 CHECKSUM=1;

关于Navicat和MYSQL字符集不统一出现的中文乱码问题_fenfei12138的博客-CSDN博客_navicat乱码中文d

“②保证MySQL字符集配置正确的前提下,在navicat的连接属性中勾选使用MYSQL字符集。”有参考价值

mysql 修改字符集 - 大大的橙子 - 博客园

mysql修改字符集 - EasilyAi - 博客园

修改查看MYSQL字符集(charset) - 清清飞扬 - 博客园

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐