用preparestatement的setObject()方法往数据库写String类型的中文出现乱码怎么回事,下面是相关代码,

用preparestatement的setObject()方法往数据库写String类型的中文出现乱码怎么回事,下面是相关代码,,第1张

在setObject前将params[i]转换为数据库试用的编码,如:

byte[] tyte1 = params[i].getBytes("GBK")//或者改成你jvm的编码

String params = new String(byte1,"UTF-8" )//改成数据库编码

看了你的描述:

转换后成 '[C@1b8ee96'

这个不是乱码,是Java的hashCode值,即对象的内存地址,产生原因是:

String sql1= " '"+id+"'"  做字符串拼接时,id是一个对象

java在做字符串拼接时,会调用toString方法,而toString默认返回的是hashcode

id的是个数组,什么类型的,包括String sql= " '"+id+"'" 你想拼成一个怎样的sql语句

int [] a = {1,2,3,4}

System.out.println(Arrays.toString(a))   // 数组变字符串

供你参考,因为要拼sql需要额外处理

String ss = "3703731197270270"

char[] id = ss.toCharArray()

String idStr = Arrays.toString(id)

idStr = idStr.substring(1).substring(0, idStr.length() - 2)

String sql = " '" + idStr + "'"

System.out.println(sql)

String sql1 = "insert into weibo value ('"  +sql +"')"

System.out.println(sql1)

看看合不合适

可能原因一:数据库不支持中文,或者是数据库编码格式和java代码编码格式不一致,这种情况需要修改数据库编码格式:

ALTER SYSTEM DISABLE RESTRICTED SESSION改完编码后执行

sql> conn / as sysdba

sql> shutdown immediate

database closed.

database dismounted.

oracle instance shut down.

sql> startup mount

oracle instance started.

total system global area  135337420 bytes

fixed size                          452044 bytes

variable size                     109051904 bytes

database buffers              25165824 bytes

redo buffers                      667648 bytes

database mounted.

sql> alter system enable restricted session

system altered.

sql> alter system set job_queue_processes=0

system altered.

sql> alter system set aq_tm_processes=0

system altered.

sql> alter database open

database altered.

sql> alter database character set internal_use UTF-8

sql> shutdown immediate

sql> startup

可能原因二:java代码生成插入语句的时候,已经发生乱码现象,这种只能是修改项目编码格式或者是在数据获取的时候直接转译代码编码格式来实现了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6767658.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-28
下一篇2023-03-28

发表评论

登录后才能评论

评论列表(0条)

    保存