在安装MySQL的时候,我遇到学生没有按照规矩设置,致使JDBC链接数据库后,对数据库的操做出现乱码问题,那个时候我就匆忙的给学生添加了一下链接设置,可是学生并无太懂,因此在这里我简单介绍一下.java
出现乱码的问题无外乎就是编码设置的不统一致使的!mysql
jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8
复制代码
做用说明: 指定字符的编码/解码的格式sql
mysql数据库用的是GBK编码,而项目数据库用的是utf-8编码.这时候若是添加了useUnicode=true&characterEncoding=UTF-8
,那么做用有以下两个方面:数据库
存储数据时缓存
数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,而后再将解码后的字节码从新使用GBK编码存放到数据库中。服务器
获取数据时socket
在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,而后再将解码后的字节码从新按UTF-8格式编码数据,最后再将数据返回给客户端。编码
注意: 在xml配置文件中配置数据库utl时,要使用&的转义字符也就是
&
spa
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
为加强可读性指定别名,有相同名字的时候用别名区分,须要被联查屡次的时候用别名区分.
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()格式会比较浪费空间,如无必要,不建议使用。