正如标题所示:可以肯定的是,我正在调试我的应用程序,因此在我将字符串放入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的主题,但没有任何答案可以帮助我,因为我确切地知道在语句中添加字符串是不正确的,而不是在数据库中。但是我不知道..。
有什么建议吗?
PS。我使用的是netbeans 6.7.1版本
编辑:我正在使用标准的netbeans调试器进行调试,并且在将字符串添加到'stm‘变量之前检查变量的状态。我甚至将getName()方法更改为带有特殊字符的静态字符串。因此,可以肯定的是,使用Method类一切都没问题。
EDIT2:我又做了一个测试。已检查stm变量,其属性之一是设置为"cp1252“的"charEncoding”。所以主要的问题是..如何改变这一点?
发布于 2011-01-18 21:04:25
对我来说,听起来像是字符编码的问题。也许驱动程序正在将字符串代码转换为字段/表/模式/数据库的适当编码,而不是让服务器执行此操作?如果您试图存储一个在字段/表/模式/数据库的编码中没有表示的字符,这就解释了'?‘人物。
发布于 2011-01-18 21:04:29
这通常由using different charsets在不同的位置发生。听起来像是将输入转换为UTF-8格式,将其转换为另一个聊天集(可能您的数据库设置为其他内容),从而中断特殊字符。
解决这个问题的方法是:在所有地方使用相同的字符集。(我建议使用UTF-8)
*看看this或my answer to another thread (这是php中的问题,但在java中几乎是一样的)
发布于 2011-01-18 21:03:55
您是否在使用Oracle?如果关于字符集的环境变量没有正确定义,我也遇到过类似的情况。
默认情况下,Oracle连接为ASCII (7位字符、A-Z、a-z、数字、标点符号等)。如果您使用该字符之外的任何字符(例如,欧洲口音、中文字符等)那么你需要使用ASCII之外的其他东西。UTF-8是最好的。如果您不这样做,您的字符将被替换为"?“。
您需要让sysadmin为您设置此设置。或者在这里看一看:
http://arjudba.blogspot.com/2009/02/what-is-nlslang-environmental-variable.html
https://stackoverflow.com/questions/4724299
复制相似问题