通过 JDBC 的俄语符号(SAP Netweaver 7.3.1,Oracle 12c)
Russian symbols via JDBC (SAP Netweaver 7.3.1, Oracle 12c)
我正在尝试通过 SAP Java 实例 (SAP Netweaver 7.3.1) 上的 JDBC 连接保存俄语文本。我正在使用下一个 Java 代码来获取 JDBC 连接并保存数据:
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/DS_Test");
Connection conn = ds.getConnection();
PreparedStatement stmt = conn.prepareStatement("INSERT INTO Z_TEST_TAB VALUES(?, ?, ?)");
stmt.setString(1, "KEY_LINE");
stmt.setString(2, "Текст2");
stmt.setString(3, "Текст3");
stmt.execute();
stmt.close();
已插入查询数据,但未正确保存俄语文本。
通常建议将 UTF-8 参数添加到数据源 URL 以解决此问题。我已将 useUnicode 和 characterEncoding 参数添加到 DataSource URL:
jdbc:oracle:thin:@db_inst:1521:RR0?useUnicode=true&characterEncoding=UTF-8
但是并没有解决问题。如果我使用参数,则根本无法建立与数据库的连接。同时连接在没有参数的情况下工作正常(但俄罗斯符号没有正确保存)
数据库看起来是为保存俄语文本而设置的,因为我可以使用其他工具保存文本(例如来自 Netweaver Developer Studio 的查询)。
oracle版本是
Oracle Database 12c 企业版 12.1.0.2.0 版 - 64 位生产版 0
文本是从 HTML 页面读取的,该页面采用 UTF-8 编码。这些值使用 javascript 读取并传递到 Java servlet,后者将文本存储在 Oracle 数据库中。
function save() {
var texts = document.querySelectorAll('.text_fields');
var text1 = texts[0].textContent;
var text2 = texts[1].textContent;
var text3 = texts[2].textContent;
var body = 'TEXT1='+encodeURIComponent(text1)+'&TEXT2='+encodeURIComponent(text2)+'&TEXT3='+encodeURIComponent(text3);
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "POST", "DBClassSave", true );
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.onload = function() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
alert("Data have been saved");
location.reload();
} else {
alert("An exception has been occurred: "+xmlHttp.status+xmlHttp.responseText);
}
}
}
xmlHttp.send(body);
}
如评论中所述,问题是数据管道中的字符编码损坏。
下次尝试使用 duckie ;)
我正在尝试通过 SAP Java 实例 (SAP Netweaver 7.3.1) 上的 JDBC 连接保存俄语文本。我正在使用下一个 Java 代码来获取 JDBC 连接并保存数据:
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/DS_Test");
Connection conn = ds.getConnection();
PreparedStatement stmt = conn.prepareStatement("INSERT INTO Z_TEST_TAB VALUES(?, ?, ?)");
stmt.setString(1, "KEY_LINE");
stmt.setString(2, "Текст2");
stmt.setString(3, "Текст3");
stmt.execute();
stmt.close();
已插入查询数据,但未正确保存俄语文本。
通常建议将 UTF-8 参数添加到数据源 URL 以解决此问题。我已将 useUnicode 和 characterEncoding 参数添加到 DataSource URL:
jdbc:oracle:thin:@db_inst:1521:RR0?useUnicode=true&characterEncoding=UTF-8
但是并没有解决问题。如果我使用参数,则根本无法建立与数据库的连接。同时连接在没有参数的情况下工作正常(但俄罗斯符号没有正确保存)
数据库看起来是为保存俄语文本而设置的,因为我可以使用其他工具保存文本(例如来自 Netweaver Developer Studio 的查询)。
oracle版本是 Oracle Database 12c 企业版 12.1.0.2.0 版 - 64 位生产版 0
文本是从 HTML 页面读取的,该页面采用 UTF-8 编码。这些值使用 javascript 读取并传递到 Java servlet,后者将文本存储在 Oracle 数据库中。
function save() {
var texts = document.querySelectorAll('.text_fields');
var text1 = texts[0].textContent;
var text2 = texts[1].textContent;
var text3 = texts[2].textContent;
var body = 'TEXT1='+encodeURIComponent(text1)+'&TEXT2='+encodeURIComponent(text2)+'&TEXT3='+encodeURIComponent(text3);
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "POST", "DBClassSave", true );
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.onload = function() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
alert("Data have been saved");
location.reload();
} else {
alert("An exception has been occurred: "+xmlHttp.status+xmlHttp.responseText);
}
}
}
xmlHttp.send(body);
}
如评论中所述,问题是数据管道中的字符编码损坏。
下次尝试使用 duckie ;)