JDBC乱码引发的"血案"

JDBC的设置说明

在安装MySQL的时候,我遇到学生没有按照规矩设置,导致JDBC连接数据库后,对数据库的操作出现乱码问题,那个时候我就匆忙的给学生添加了一下连接设置,但是学生并没有太懂,所以在这里我简单介绍一下.

出现乱码的问题无外乎就是编码设置的不统一导致的!

  • 可能是代码的编码与数据库的编码不同
    • 注意以后全部使用UTF-8格式就好
jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8
复制代码

作用说明: 指定字符的编码/解码的格式

情景描述

mysql数据库用的是GBK编码,而项目数据库用的是utf-8编码.这时候如果添加了useUnicode=true&characterEncoding=UTF-8,那么作用有如下两个方面:

  1. 存储数据时

    数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。

  2. 获取数据时

    在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。

注意: 在xml配置文件中配置数据库utl时,要使用&的转义字符也就是&

JDBC属性说明

jdbc:mysql://[host][,failoverhost...][:port]/[database] »[?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]
复制代码
参数名称默认值最低版本要求参数描述
user所有版本数据库用户名(用于连接数据库)
password所有版本用户密码(用于连接数据库)
useUnicodefalse1.1g是否使用Unicode字符集
characterEncodingfalse1.1g指定字符编码
autoReconnectfalse1.1当数据库连接异常中断时,是否自动重新连接?
autoReconnectForPoolsfalse3.1.3是否使用针对数据库连接池的重连策略
failOverReadOnlytrue3.0.12自动重连成功后,连接是否设置为只读?
maxReconnects31.1autoReconnect设置为true时,重试连接的次数
initialTimeout21.1autoReconnect设置为true时,
两次重连之间的时间间隔,单位:秒
connectTimeout03.0.1和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本
socketTimeout03.0.1socket操作(读写)超时,单位:毫秒。 0表示永不超时

对应中文环境,通常MySQL连接URL可以设置为:

jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&failOverReadOnly=false
复制代码

autoReconnect=true : 如果你已经升级好了mysql-connector,其中的characterEncoding=utf8可以被自动被识别为utf8mb4(当然也兼容原来的utf8),而autoReconnect配置我强烈建议配上,我之前就是忽略了这个属性,导致因为缓存缘故,没有读取到DB最新配置,导致一直无法使用utf8mb4字符集,多么痛的领悟!!

在以后的MyBatis中处理多条SQL语句的时候,因为MySQL驱动没有开启批量执行SQL的开关,我们需要再MySQL连接的URL时候,为其加上allowMultiQueries参数,设置为true

jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
复制代码

在使用数据库连接池的时候,最好设置如下两个参数

autoReconnect=true&failOverReadOnly=false

MySQL SQL语句别名不生效问题:useOldAliasMetadataBehavior

为增强可读性指定别名,有相同名字的时候用别名区分,需要被联查多次的时候用别名区分.

jdbc:mysql://localhost/openemm?useUnicode=yes&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true
其中:
+ jdbc: mysql://localhost/openemm?这个代表数据库链接地址,
+ useUnicode=yes&characterEncoding=UTF-8这个代表允许用户自己设定数据库编码,而且设置成UTF-8
+ useOldAliasMetadataBehavior=true这个代表数据库里面允许有别名
复制代码

连接后再数据库中查询不到数据

明明数据库内有符合条件的数据,但是就是无法查询到?可能是犯了以一个低级的错误。

数据库内尽量不要使用nchar()这种格式,因为固定了位数,当数据的位数不够的时候就会使用空字符来占位。如:

name nchar(10) -->施维新

使用String输出时,会看到施维新□□□□□□□
复制代码

同时nchar()格式会比较浪费空间,如无必要,不建议使用。

附录

《JDBC乱码引发的

    原文作者:MySql
    原文地址: https://juejin.im/post/5ac967e76fb9a028ba1fbbbe
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞