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中的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&useUnicode=true&characterEncoding=UTF-8"/>
实际设置可以删除:useUnicode=true&characterEncoding=UTF-8,只保留如下: url=jdbc:mysql://localhost:3306/mybatis2?useSSL=false
mybatis自动/默认使用Unicode和utf-8
有参考价值的文章:
关于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字符集。”有参考价值