我试图从JSP表单中获取值并将其保存到MySQL中的用户表,其中一个字段在插入时加密但我在Tomcat日志中收到以下错误
java.sql.SQLException:字符串值不正确:' \ xEF \ xA3H \ x013p ...' 我已阅读"Incorrect string value" when trying to insert UTF-8 into MySQL via JDBC?并设置了字符编码
ALTER DATABASE mydb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE users CHANGE phone phone VARCHAR(265) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_c
我还没有接近MySQL服务器ini文件,并更改了默认字符集,因为实际上我很可能无权访问此文件并允许更改值。
查询如下。关键是一个类似于AbcD10Qs的简单字符串值,它可能是我的模型中的查询导致问题吗?
String key=confUtil.encDeckey();
String query
= "INSERT INTO users (fName, lName, email,pwd,phone)"
+ "VALUES (?, ?, ?, ?, AES_ENCRYPT(?,?))";
try {
ps = connection.prepareStatement(query);
ps.setString(1, user.getFName());
ps.setString(2, user.getLName());
ps.setString(3, user.getEmail());
ps.setString(4, user.getPwd());
ps.setString(5, user.getPhone());
ps.setString(6,key);
ps.executeUpdate();
我使用连接池来管理与DB的连接
private ConnectionPool() {
try {
InitialContext ic = new InitialContext();
dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/testdb");
} catch (NamingException e) {
System.err.println(e);
}
}
context.xml中没有设置字符编码
<Resource name="jdbc/medsdb" type="javax.sql.DataSource" auth="Container"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/medsdb?autoReconnect=true"
username="testdbbuser" password="xxxxxxx"
logAbandoned="true"
removeAbandoned="true" removeAbandonedTimeout="60"
maxActive="100" maxIdle="30" maxWait="10000" />
答案 0 :(得分:1)
https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html提到以下内容:“许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有VARBINARY或BLOB二进制字符串数据类型的列。这将避免可能会更改数据值的尾随空格删除或字符集转换的潜在问题,例如,如果您使用非二进制字符串数据类型(CHAR,VARCHAR,TEXT)可能会出现“尝试不使用VARCHAR作为”phone“的字段类型