Ich versuche, die Werte aus einem HTML-Formular auf einer JSP und speichern sie in einer Benutzertabelle in MySQL mit einem der Felder bei der Einfügung verschlüsselt aber ich bekomme die folgende Fehlermeldung im Tomcat protokolliertJAVA MySQL Einfügen mit AES_ENCRYPT fehlgeschlagen java.sql.SQLException: Falscher String Wert
java.sql.SQLException: Falsche String-Wert: '\ xEF \ xA3H \ x013p ...' ich "Incorrect string value" when trying to insert UTF-8 into MySQL via JDBC? gelesen haben und stellen Sie die Zeichenkodierung
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
Ich habe nicht in der Nähe der MySQL-Server-Ini-Datei und änderte den Standard-Zeichensatz da in der Realität werde ich höchstwahrscheinlich nicht h Zugriff auf diese Datei und Erlaubnis, die Werte zu ändern.
Die Abfrage lautet wie folgt. Der Schlüssel ist ein einfacher String-Wert, der AbcD10Qs ähnlich ist. Könnte es meine Abfrage in meinem Modell sein, die das Problem verursacht?
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();
ich einen Verbindungspool mit der Verbindung zum DB
private ConnectionPool() {
try {
InitialContext ic = new InitialContext();
dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/testdb");
} catch (NamingException e) {
System.err.println(e);
}
}
Keiner Zeichencodierung im 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" />
könnten Sie DDL für Ihre Tabelle teilen – Ravi
https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html erwähnen folgenden: „Viele Verschlüsselungs- und Komprimierungsfunktionen Strings zurückgeben, für die das Ergebnis kann beliebige Byte-Werte enthalten. Wenn Sie diese Ergebnisse speichern möchten, verwenden Sie eine Spalte mit dem Datentyp VARBINARY oder BLOB binary string. Dadurch werden potenzielle Probleme mit der nachträglichen Leerzeichenentfernung oder Zeichensatzkonvertierung vermieden, die Datenwerte ändern könnten, wie sie beispielsweise auftreten können, wenn Sie einen nicht binären Zeichenfolgendatentyp verwenden (CHAR, VARCHAR, TEXT) "Verwenden Sie VARCHAR nicht als Feldtyp für" phone " – Quintium
Änderte den Spaltentyp in VARBINARY und das funktionierte Danke Fügen Sie es als Antwort hinzu und ich werde es so markieren – Graham