1、使用jdbc链接数据库,插入数据库时,数据里的数据显示乱码,为 " ??? "html
两种解决方案:mysql
一、修改服务端的mysql配置文件,编辑my.cnf文件,在[mysqld]下添加一行character_set_server = utf8,而后重启mysql服务sql
二、使用jdbc链接时,指定正确的编码,jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8数据库
2、为何配置了character_set_server = utf8,jdbc链接时就能够不指定编码编码
查阅官方文档,jdbc在链接数据库时,会先查询服务端的character_set_server值,再肯定链接时使用的编码。要想覆盖客户端的自动检测编码功能,可使用characterEncoding属性spa
文档地址:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.htmlcode
3、MYSQL的字符处理机制是怎样的,为何jdbc不指定编码或者服务端不设置character_set_server=utf8会致使乱码server
先查看下MYSQL的字符集htm
解释下这几个参数:blog
character_set_client:客户端来源数据使用的字符集
character_set_connection:链接层字符集
character_set_database:当前选中数据库的默认字符集
character_set_filesystem:把os上文件名转化成此字符集,默认binary是不作任何转换的
character_set_results:查询结果字符集
character_set_server:默认的内部操做字符集
character_set_system:系统元数据字符集
character_sets_dir:字符集的路径
修改服务端的mysql配置文件,编辑my.cnf文件,在[mysqld]下添加一行character_set_server = utf8,而后重启mysql服务,再去查询字符集:
而后了解下字符集转换流程:
插入数据:
服务端将数据由客户端(character_set_client)字符集转成character_set_connection,而后将character_set_connection字符集转成相应的字符集存储到磁盘中,这个相应的字符集会按照如下优先级来判断:
一、建立表时设置的字符集
二、建立库时设置的字符集
三、character_set_database字符集
三、character_set_server字符集
查询数据:
服务端将数据由存储在磁盘中的字符集,转换成character_set_results字符集,返回给客户端
而后分析下
一、jdbc不设置characterEncoding=utf8,服务端character_set_server为latin1,jdbc以latin1字符集链接数据库,数据库服务端将latin1转成utf8而后存储到磁盘(由于character_set_connection和建立表指定的字符集都是utf8),这时就形成了乱码
二、jdbc不设置characterEncoding=utf8,服务端character_set_server为utf8,或者jdbc设置characterEncoding=utf8,jdbc都以utf8字符集链接数据库,数据库服务端以utf8存储到磁盘,这时数据就是正常的