有没有知道这个是什么情况的?为什么报错?该如何解决呢?为什么保存完数据后,数据库无法显示中文,中午全部变成问号❓?
数据库连接后面加useUnicode=true&characterEncoding=utf-8
/**
* 通配符?使用
*/
public class GenericTest {
public static void main(String[] args) {
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>();
name.add("alex");
age.add(21);
number.add(666);
getData(name);
getData(age);
getData(number);
}
private static void getData(List<?> data) {
System.out.println("data :" + data.get(0));
}
}
public class GenericTest {
public static void main(String[] args) {
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>();
name.add("alex");
age.add(21);
number.add(666);
//getUperNumber(name);
getUperNumber(age);
getUperNumber(number);
}
private static void getUperNumber(List<? extends Number> data) {
System.out.println("data :" + data.get(0));
}
}
类型通配符下限通过形如 List<? super Number>来定义,表示类型只能接受Number及其三层父类类型
答案:
这个问题可能是因为数据库字符集与Java编码不一致导致的。以下是可能的解决方法:
String defaultCharset = Charset.defaultCharset().displayName(); //获取Java编码 Charset charset = Charset.forName("UTF-8"); //获取数据库字符集 if (charset.equals(Charset.forName(defaultCharset))) { System.out.println("字符集匹配"); } else { System.out.println("字符集不匹配,需要进行调整"); }
String url = "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8"; Connection conn = DriverManager.getConnection(url, username, password);
其中,test为数据库名称,username和password为连接数据库所需的用户名和密码。
System.setProperty("file.encoding", "UTF-8"); Class.forName("com.mysql.jdbc.Driver");
String str = "中文"; byte[] bytes = str.getBytes(Charset.forName("UTF-8")); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO mytable (name) VALUES (?)"); pstmt.setBytes(1, bytes); pstmt.executeUpdate();
ResultSet rs = stmt.executeQuery("SELECT * FROM mytable"); while (rs.next()) { byte[] bytes = rs.getBytes("name"); String str = new String(bytes, Charset.forName("UTF-8")); System.out.println(str); }
如果以上方法均不能解决问题,可能需要更深入地检查和调试。