JDBC乱码引起的"血案"

JDBC的设置说明

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

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

  • 多是代码的编码与数据库的编码不一样
    • 注意之后所有使用UTF-8格式就好
jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8
复制代码

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

情景描述

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

  1. 存储数据时缓存

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

  2. 获取数据时socket

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

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

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能够设置为:code

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()格式会比较浪费空间,如无必要,不建议使用。

附录

相关文章
相关标签/搜索