Java 如何通过JDBC接口将UTF-8字符串正确写入MySQL
连接到数据库:Java 如何通过JDBC接口将UTF-8字符串正确写入MySQL,java,mysql,jdbc,utf-8,Java,Mysql,Jdbc,Utf 8,连接到数据库: public DBSource(ConnectionInfo ci) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException { Class.forName("com.mysql.jdbc.Driver").newInstance(); String dbPath = String.fo
public DBSource(ConnectionInfo ci) throws
ClassNotFoundException, InstantiationException,
IllegalAccessException, SQLException
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
String dbPath = String.format(
"jdbc:mysql://%s:%d/%s?user=%s&password=%s&characterEncoding=utf-8&" +
"useUnicode=true", ci.host, ci.port, ci.dbName, ci.user, ci.password);
conn = java.sql.DriverManager.getConnection(dbPath);
prepareTables();
}
表格创建代码:
private void prepareTables() throws SQLException
{
java.sql.Statement stat = conn.createStatement();
String query = "set names utf8";
stat.execute(query);
query = "set character set utf8";
stat.execute(query);
query = "show variables like '%char%'";
stat.execute(query);
java.sql.ResultSet rs = stat.getResultSet();
while (rs.next())
{
String k = rs.getString(1);
String v = rs.getString(2);
System.out.println(k + " - " + v);
}
query = "drop table if exists clt";
stat.execute(query);
query = "create table clt"
+ "("
+ " id bigint not null"
+ ", text varchar(50) not null"
+ ") default character set utf8";
stat.execute(query);
}
行插入:
public void visit(Insert i) throws SQLException
{
String query = "insert into clt"
+ " (id, text) values (?, ?)";
java.sql.PreparedStatement stmt = conn.prepareStatement(query);
if (i.rowData.id == 12656697)
{
String toOut = "<<< " + Long.toString(i.rowData.id) + " - " + i.rowData.text;
System.out.println(toOut);
}
int it = 0;
stmt.setLong(++it, i.rowData.id);
stmt.setString(++it, i.rowData.text);
stmt.execute();
stmt.close();
}
输出:
character_set_client - utf8
character_set_connection - latin1
character_set_database - latin1
character_set_filesystem - binary
character_set_results - utf8
character_set_server - utf8
character_set_system - utf8
character_sets_dir - /usr/share/mysql/charsets/
<<< 12656697 - Апарати
>>> 12656697 - ???????
character\u set\u客户端-utf8
字符集连接-拉丁1
字符集数据库-拉丁1
字符集文件系统-二进制
字符集结果-utf8
字符集服务器-utf8
字符集系统-utf8
字符集目录-/usr/share/mysql/charsets/
> 12656697 - ???????
问题:在表I的文本字段中有“???????”符号
预期字符串为:АПааааа
结果:
这是某种魔法
我解决了一个问题。。。但如果有人能给我解释一下,我还是会很感激的
所以
结果相同
query=“set character set utf8”
stat.execute(查询)李>
它正在工作!!!:)确保正确定义了MySQL配置编码。使用以下命令检查您的设置和修改的正确性:
show variables like 'character%';
和显示诸如“collation%”之类的变量代码>
将这些行添加到my.cnf或my.ini:
对于MySQL 5.1.nn和更高版本5.5.29,您只需要以下两行代码:
[mysqld]
character-set-server = utf8
character-set-filesystem = utf8
对于MySQL 5.0.nn和更早版本,请使用以下设置:
[client]
default-character-set=utf8
它可能更方便用于您的设置。版本5+非常好
在Java程序中,按如下方式连接:
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase?useUnicode=true&characterEncoding=UTF-8","user","passwd");
如果获得???????
则添加参数characterEncoding=utf-8
,而不是useUnicode=true
。请参见以下示例
英文文本:
String url = "jdbc:mysql://localhost:" + port + "/DBName?useUnicode=true&...";
俄语语言文本:
String url = "jdbc:mysql://localhost:" + port + "/DBName&characterEncoding=utf-8&...";
我的my.cnfI上没有[mysql]组,还添加了[mysql]组。。。没有帮助:(你有什么MySQL版本和操作系统?MySQL连接器java 5.1.14,MySQL服务器版本:5.1.49太好了!我的设置来自MySQL版本5.0.51。
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase?useUnicode=true&characterEncoding=UTF-8","user","passwd");
String url = "jdbc:mysql://localhost:" + port + "/DBName?useUnicode=true&...";
String url = "jdbc:mysql://localhost:" + port + "/DBName&characterEncoding=utf-8&...";