Java准备语句集字符串更改字符

hpxqektj  于 2023-03-06  发布在  Java
关注(0)|答案(4)|浏览(155)

如标题所示:可以肯定的是,我正在调试我的应用程序,因此在我将字符串放入PreparedStatement变量的行中,特殊字符更改为"?"。我实际上不知道在哪里搜索应该修复它的东西,所以我不知道是否需要代码。总之,我将在这里放置一些:

PreparedStatement stm = null;
String sql = "";

    try{
      sql = "INSERT INTO methods (name, description) VALUES (?, ?)";
      stm = connection.prepareStatement(sql);
      stm.setString(1, method.getName());
      stm.setString(2, method.getDescription());
      //...
    }catch(Exception e){}

调试时,方法对象中的"name"字段是正确的,但将其添加到stm变量后,将其字符更改为"?"。
我发现了一个关于SO的类似问题的主题,但是没有任何答案可以帮助我,因为我确切地知道在语句中添加字符串是不正确的,而不是在数据库中。
有什么建议吗?
PS.我用的是netbeans 6.7.1版本
编辑:我正在用标准的netbeans调试器进行调试,并且在向"stm"变量添加字符串之前检查变量的状态。我甚至将getName()方法更改为带有特殊字符的静态字符串。因此,可以肯定的是,Method类的一切都是正常的。
编辑2:我又做了一个测试。检查了stm变量,它的一个属性是"charEncoding",它被设置为"cp1252"。所以主要的问题是...如何改变它?

enxuqcxy

enxuqcxy1#

这通常发生在using different charsets在不同的位置。听起来像你得到你的输入作为UTF-8,转换到另一个聊天集(也许你的数据库是设置为其他东西),这打破了特殊字符。
要解决此问题:在任何地方使用相同的字符集。(我建议使用UTF-8)

  • 看看this或者我对另一个线程的回答(这是PHP中的问题,但在java中几乎是一样的)
j13ufse2

j13ufse22#

听起来像是字符编码问题。也许驱动程序正在将您的字符串转换为字段/表/架构/数据库的适当编码,而不是让服务器来做这件事?如果您试图存储一个在字段/表/架构/数据库的编码中没有表示的字符,这就可以解释“?”字符。

dgenwo3n

dgenwo3n3#

您使用的是Oracle吗?如果有关字符集的环境变量定义不正确,我也遇到过类似的情况。
默认情况下,Oracle连接是ASCII(7位字符、A-Z、a-z、数字、标点符号等)。如果您使用该字符以外的任何字符(例如欧洲口音、中文字符等),则需要使用ASCII以外的字符。UTF-8是最佳选择。如果您不使用,字符将被“?"替换。
你需要让你的系统管理员为你设置。或者看看这里:
http://arjudba.blogspot.com/2009/02/what-is-nlslang-environmental-variable.html

xtupzzrd

xtupzzrd4#

我这样做:

PreparedStatement ps = null;
List varBind       = new ArrayList();
String strSQL ="INSERT INTO table..... ";
varBind.add(claveEPO); //1
varBind.add(cg_num_distribuidor); //2
varBind.add(numero_docto); //3

// it's importan to do this
byte ptextRazon[] = cgRazonSocialEpo.getBytes("ISO-8859-1");
String razonSocial = new String(ptextRazon, "UTF-8");
varBind.add(razonSocial);//26

ps = con.queryPrecompilado(strSQL.toString(), varBind);
ps.executeUpdate();
ps.close();

相关问题