转载

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 所有版本 用户密码(用于连接数据库)
useUnicode false 1.1g 是否使用Unicode字符集
characterEncoding false 1.1g 指定字符编码
autoReconnect false 1.1 当数据库连接异常中断时,是否自动重新连接?
autoReconnectForPools false 3.1.3 是否使用针对数据库连接池的重连策略
failOverReadOnly true 3.0.12 自动重连成功后,连接是否设置为只读?
maxReconnects 3 1.1 autoReconnect设置为true时,重试连接的次数
initialTimeout 2 1.1 autoReconnect设置为true时,
两次重连之间的时间间隔,单位:秒
connectTimeout 0 3.0.1 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本
socketTimeout 0 3.0.1 socket操作(读写)超时,单位:毫秒。 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()格式会比较浪费空间,如无必要,不建议使用。

原文  https://juejin.im/post/5ac967e76fb9a028ba1fbbbe
正文到此结束
Loading...