假设我在db2zOS表中有一列的数据类型为VARCHAR(500(,我想使用prepared语句将数据插入该列。但该数据/字符串之间有null字符。例如:";你好\0测试\0示例&";。我的问题是,setString(index,str(是否会用空格或任何其他字符更改那些空字符?还是将按原样插入?
我尝试插入数据,但不确定。我发现原始字符串和插入字符串的十六进制值发生了变化。
'\0'被视为null。在回答您的问题时,您的字符串将按原样插入。它的内部将为null。然后,它将取决于您的DBMS,在您的案例"db2"中,它将如何处理字符串中的null。
我已经用MySQL测试过了。我得到的数据与插入的数据相同。此外,我使用char而不是String验证了它,并打印了它们的ascii值,这只是一个额外的检查。
我用这个代码打印每个字符值:
private static void printStringAndAscii(String str)
{
System.out.println("Incoming String:" + str);
System.out.println("Char with ASCII Values:");
for (char c : str.toCharArray())
{
System.out.println(((int) c) + "-" + c);
}
}
为了用数据库测试它,我首先打印了你的给定字符串并保存在数据库中,然后提取它并打印出来(删除是为了我自己的测试(。我已经用MySQL测试了以下代码utf8默认版本:
Class.forName("com.mysql.jdbc.Driver").newInstance();
String originalString = "hello test example!";
try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/corporate", "user", "pwd"))
{
printStringAndAscii(originalString);
//Removing previously inserted entry
PreparedStatement prepareStatement = connection.prepareStatement("DELETE FROM tip WHERE tip_id=?");
prepareStatement.setInt(1, 1);
int result = prepareStatement.executeUpdate();
prepareStatement.close();
System.out.println("Delete Result:" + result);
//Inserting new entry
prepareStatement = connection.prepareStatement("INSERT INTO tip(tip_id,tip_text) VALUES(?,?)");
prepareStatement.setString(1, "1");
prepareStatement.setString(2, originalString);
result = prepareStatement.executeUpdate();
System.out.println("Insert Result:" + result);
prepareStatement.close();
Statement statement = connection.createStatement();
//Loading inserted entry from database
ResultSet resultSet = statement.executeQuery("SELECT * FROM tip WHERE tip_id=1");
if (resultSet.next())
{
//printing the fetched string from database
String string = resultSet.getString(2);
printStringAndAscii(string);
}
resultSet.close();
statement.close();
connection.close();
}
catch (Throwable e)
{
e.printStackTrace();
}
有趣的是,我发现System.out.println((打印直到它找到"\0"(如c(,然而prepared语句插入了长度完整的字符串。