正如标题中所示:可以肯定的是,我正在调试我的应用程序,因此我将字符串放入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上找到了一个关于类似sitoatuin的话题,但是没有任何答案可以帮助我,因为我真的知道在语句中添加字符串有些不对,而不是在数据库中。但我不知道是什么..
任何sugestions?
PS。我正在使用netbeans 6.7.1版本
编辑:我正在使用标准netbeans调试器进行调试,并在将字符串添加到'stm'变量之前检查变量状态。我甚至将getName()方法更改为带有特殊字符的静态字符串。所以使用Method类确保一切正常。EDIT2:我又做了一次测试。检查的stm变量和其中一个属性是“charEncoding”,它被设置为“cp1252”。所以主要的问题是......如何改变它?
答案 0 :(得分:3)
这通常由using different charsets在不同位置发生。听起来你正在以UTF-8的形式获得输入,将其转换为另一个聊天集(可能是你的数据库被设置为别的东西),这会破坏特殊字符。
解决此问题:在任何地方使用相同的字符集 *。 (我建议使用UTF-8)
*看看this或my answer to another thread(这是关于php中的一个问题,但在java中它几乎是一样的)
答案 1 :(得分:1)
您使用的是 Oracle 吗?如果没有正确定义有关字符集的环境变量,我遇到了类似的情况。
默认情况下,Oracle连接是ASCII(7位字符,A-Z,a-z,数字,标点符号......)。如果您使用其外的任何字符(例如欧洲口音,中文字符......),则需要使用ASCII以外的其他字符。 UTF-8是最好的。如果不这样做,您的角色将被替换为“?”。
您需要让系统管理员为您设置此功能。或者看看这里:
http://arjudba.blogspot.com/2009/02/what-is-nlslang-environmental-variable.html
答案 2 :(得分:1)
听起来像是一个字符编码问题。也许驱动程序将您的字符串转码为字段/表/模式/数据库的适当编码,而不是让服务器执行此操作?如果您尝试存储在字段/表/模式/数据库的编码中没有表示的字符,那么可以解释'?'字符。