使用JDBC中的出现的乱码和查询无结果问题

时间:2022-04-23 09:53:16

使用JDBC中的问题

  1. 连接的后出现查询结果是乱码。

1.可能是代码的编码与数据库的编码不同

​ 有可以将二者都设置为UTF-8

2.如果比较懒得话可以只设代码为UTF-8

mysql 连接url中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:mysql://[host][,failoverhost...][:port]/[database] »[?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...

实例:

jdbc:mysql://localhost:3306/sakila?profileSQL=true

现只列举几个重要的参数,如下表所示:

参数名称                    参数说明                                                                                                                         缺省值     最低版本要求
user 数据库用户名(用于连接数据库) 所有版本
password 用户密码(用于连接数据库) 所有版本
useUnicode 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true false 1.1g
characterEncoding 当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk false 1.1g
autoReconnect 当数据库连接异常中断时,是否自动重新连接? false 1.1
autoReconnectForPools 是否使用针对数据库连接池的重连策略 false 3.1.3
failOverReadOnly 自动重连成功后,连接是否设置为只读? true 3.0.12
maxReconnects autoReconnect设置为true时,重试连接的次数 3 1.1
initialTimeout autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 2 1.1
connectTimeout 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本 0 3.0.1
socketTimeout socket操作(读写)超时,单位:毫秒。 0表示永不超时 0 3.0.1

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

jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=gbk&autoReconnect=true&failOverReadOnly=false

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

autoReconnect=true&failOverReadOnly=false

mysql sql语句别名不生效问题: useOldAliasMetadataBehavior

为增强可读性指定别名

有相同名字的时候用别名区分

需要被联查多次的时候用别名区分

实例:

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

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

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

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

name nchar(10) -->施维新

使用String输出时,会看到施维新□□□□□□□

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