• jdbc连接数据库,中文出现乱码的问题


    一、使用jdbc连接数据库,插入数据库时,数据里的数据显示乱码,为 " ??? "

    两种解决方案:

    1、修改服务端的mysql配置文件,编辑my.cnf文件,在[mysqld]下添加一行character_set_server = utf8,然后重启mysql服务

    2、使用jdbc连接时,指定正确的编码,jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8

    二、为什么配置了character_set_server = utf8,jdbc连接时就可以不指定编码

    查阅官方文档,jdbc在连接数据库时,会先查询服务端的character_set_server值,再确定连接时使用的编码。要想覆盖客户端的自动检测编码功能,可以使用characterEncoding属性

    文档地址:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.html

    三、MYSQL的字符处理机制是怎样的,为什么jdbc不指定编码或者服务端不设置character_set_server=utf8会导致乱码

    先查看下MYSQL的字符集

    解释下这几个参数:

    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字符集转成相应的字符集存储到磁盘中,这个相应的字符集会按照以下优先级来判断:

    1、创建表时设置的字符集

    2、创建库时设置的字符集

    3、character_set_database字符集

    3、character_set_server字符集

    查询数据:

    服务端将数据由存储在磁盘中的字符集,转换成character_set_results字符集,返回给客户端

    然后分析下

    1、jdbc不设置characterEncoding=utf8,服务端character_set_server为latin1,jdbc以latin1字符集连接数据库,数据库服务端将latin1转成utf8然后存储到磁盘(因为character_set_connection和创建表指定的字符集都是utf8),这时就造成了乱码

    2、jdbc不设置characterEncoding=utf8,服务端character_set_server为utf8,或者jdbc设置characterEncoding=utf8,jdbc都以utf8字符集连接数据库,数据库服务端以utf8存储到磁盘,这时数据就是正常的

  • 相关阅读:
    C#单例模式详解
    Unity基础知识学习笔记二
    Unity基础知识学习笔记一
    pat 团体赛练习题集 L2-007. 家庭房产
    JOBDU 题目1100:最短路径
    POJ 2492 A Bug's Life
    pat 团体赛练习题集 L2-008. 最长对称子串
    pat 团体赛练习题集 L2-006. 树的遍历
    POJ 1511 Invitation Cards
    codevs——1003——电话连线
  • 原文地址:https://www.cnblogs.com/dj3839/p/10610133.html
Copyright © 2020-2023  润新知