2017-10-18 1 views
0

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" /> 
+0

könnten Sie DDL für Ihre Tabelle teilen – Ravi

+0

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

+0

Änderte den Spaltentyp in VARBINARY und das funktionierte Danke Fügen Sie es als Antwort hinzu und ich werde es so markieren – Graham

Antwort

1

https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html erwähnen folgenden gesetzt verwalten: „Viele Verschlüsselungs- und Komprimierungsfunktionen geben Strings zurück, für die das Ergebnis beliebige Bytewerte enthalten kann Wenn Sie diese Ergebnisse speichern möchten, verwenden Sie eine Spalte mit einem VARBINARY- oder BLOB-Binärstri ng Datentyp. 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 "

Verwandte Themen