原文: https://juejin.im/post/5ac967e76fb9a028ba1fbbbe#heading-4
在安装MySQL的时候,我遇到学生没有按照规矩设置,导致JDBC连接数据库后,对数据库的操作出现乱码问题,那个时候我就匆忙的给学生添加了一下连接设置,但是学生并没有太懂,所以在这里我简单介绍一下.
出现乱码的问题无外乎就是编码设置的不统一导致的!
- 可能是代码的编码与数据库的编码不同
- 注意以后全部使用UTF-8格式就好
jdbc:mysql:
复制代码
作用说明: 指定字符的编码/解码的格式
情景描述
mysql数据库用的是GBK编码,而项目数据库用的是utf-8编码.这时候如果添加了useUnicode=true&characterEncoding=UTF-8
,那么作用有如下两个方面:
- 存储数据时
数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。 - 获取数据时
在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。
注意: 在xml配置文件中配置数据库utl时,要使用&的转义字符也就是
&
JDBC属性说明
jdbc:mysql:
复制代码
参数名称 | 默认值 | 最低版本要求 | 参数描述 |
---|---|---|---|
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:
复制代码
autoReconnect=true : 如果你已经升级好了mysql-connector,其中的characterEncoding=utf8可以被自动被识别为utf8mb4(当然也兼容原来的utf8),而autoReconnect配置我强烈建议配上,我之前就是忽略了这个属性,导致因为缓存缘故,没有读取到DB最新配置,导致一直无法使用utf8mb4字符集,多么痛的领悟!!
在以后的MyBatis中处理多条SQL语句的时候,因为MySQL驱动没有开启批量执行SQL的开关,我们需要再MySQL连接的URL时候,为其加上allowMultiQueries参数,设置为true
jdbc:mysql:
复制代码
在使用数据库连接池的时候,最好设置如下两个参数
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()格式会比较浪费空间,如无必要,不建议使用。