比较来自 JDBC ResultSet 的文本输出时出错
Errors comparing text output from JDBC ResultSet
我正在尝试逐字比较来自两个 Oracle 数据库的 return 字符串列表。
我尝试使用此库 (java-diff-utils) 比较文本。
我在比较文本输出时 运行 遇到了不一致的结果。 There is a longer description here 我打开了一个问题,但似乎错误可能是数据库中数据编码的结果。
我试过删除特殊字符或修剪空格,但它似乎没有影响比较结果,所以我认为使用不同 NLS_CHARACTERSETS 的两个数据库和转换为字符串。
使用 select * from NLS_DATABASE_PARAMETERS;
我得到一个数据库使用 NLS_CHARACTERSET,AL32UTF8
而另一个使用 NLS_CHARACTERSET,WE8MSWIN1252
。
是否可以使用 getString 将文本输出标准化,从而考虑到数据库中的不同编码?或者还有其他我可能忽略的东西吗?
目前正在这样做:
List<String> databaseList = new ArrayList<>();
while (rs.next()) {
int columnCount = rs.getMetaData().getColumnCount();
StringBuilder rsStringBuilder = new StringBuilder();
for (int i = 1; i <= columnCount; i++ ){
String rsString = null;
try {
rsString = rs.getString(i);
} catch (SQLException e1) {
e1.printStackTrace();
}
rsStringBuilder.append(rsString).append(",");
}
databaseList.add(rsStringBuilder.toString());
}
然后我会将数据库一的数据库列表的结果与数据库二的数据库列表的结果进行比较。
我也试过这样做来标准化信息,但是 return 一些字符打印不正确,并且在相同位置仍然标记不正确:
for (int i = 1; i <= columnCount; i++) {
byte[] bytes = rs.getBytes(i);
String rsString;
if (bytes != null) {
rsString = new String(bytes, StandardCharsets.UTF_8);
rsStringBuilder.append(rsString).append(",");
} else {
rsString = "NULLVALUE";
rsStringBuilder.append(rsString).append(",");
}
}
它返回类似这样的东西 A_C16911,USUMMARY,VARCHAR2,�8,IAMNULL,Y,
。
在阅读了一些关于使用 UTF-8 作为标准的其他答案后,我想尝试这个。任何帮助,将不胜感激。
几乎可以肯定是数据库的NLS_CHARACTERSET设置所致;右单引号 ’
的 Unicode AL32UTF8 字符集值为 U+2019
;对于 WE8MSWIN1252,它是 0x92
。
您可能必须遍历从 String, and for each element, do the following from the Character class: invoke codePointAt(char[] a, int index) call, and then use the returned int
to call isAlphabetic(int codePoint), and then maybe isDigit(int codePoint) 填充的 char[] 数组,然后如果其中任何一个为真,则与另一个数据库进行比较,如果两者都为假,则您可能正在处理两个字符集中不同的标点符号或符号,可能会被忽略。
为了使您的比较更加可靠,您可能还需要检查 isWhitespace(int codePoint),因为我看到的一个常见问题是人们从 Microsoft Word 文档或包含非-breaking space (U+00A0
) 并且数据库包含常规 space (U+0020
)。该方法还检查制表符、垂直制表符等。
我正在尝试逐字比较来自两个 Oracle 数据库的 return 字符串列表。
我尝试使用此库 (java-diff-utils) 比较文本。
我在比较文本输出时 运行 遇到了不一致的结果。 There is a longer description here 我打开了一个问题,但似乎错误可能是数据库中数据编码的结果。
我试过删除特殊字符或修剪空格,但它似乎没有影响比较结果,所以我认为使用不同 NLS_CHARACTERSETS 的两个数据库和转换为字符串。
使用 select * from NLS_DATABASE_PARAMETERS;
我得到一个数据库使用 NLS_CHARACTERSET,AL32UTF8
而另一个使用 NLS_CHARACTERSET,WE8MSWIN1252
。
是否可以使用 getString 将文本输出标准化,从而考虑到数据库中的不同编码?或者还有其他我可能忽略的东西吗?
目前正在这样做:
List<String> databaseList = new ArrayList<>();
while (rs.next()) {
int columnCount = rs.getMetaData().getColumnCount();
StringBuilder rsStringBuilder = new StringBuilder();
for (int i = 1; i <= columnCount; i++ ){
String rsString = null;
try {
rsString = rs.getString(i);
} catch (SQLException e1) {
e1.printStackTrace();
}
rsStringBuilder.append(rsString).append(",");
}
databaseList.add(rsStringBuilder.toString());
}
然后我会将数据库一的数据库列表的结果与数据库二的数据库列表的结果进行比较。 我也试过这样做来标准化信息,但是 return 一些字符打印不正确,并且在相同位置仍然标记不正确:
for (int i = 1; i <= columnCount; i++) {
byte[] bytes = rs.getBytes(i);
String rsString;
if (bytes != null) {
rsString = new String(bytes, StandardCharsets.UTF_8);
rsStringBuilder.append(rsString).append(",");
} else {
rsString = "NULLVALUE";
rsStringBuilder.append(rsString).append(",");
}
}
它返回类似这样的东西 A_C16911,USUMMARY,VARCHAR2,�8,IAMNULL,Y,
。
在阅读了一些关于使用 UTF-8 作为标准的其他答案后,我想尝试这个。任何帮助,将不胜感激。
几乎可以肯定是数据库的NLS_CHARACTERSET设置所致;右单引号 ’
的 Unicode AL32UTF8 字符集值为 U+2019
;对于 WE8MSWIN1252,它是 0x92
。
您可能必须遍历从 String, and for each element, do the following from the Character class: invoke codePointAt(char[] a, int index) call, and then use the returned int
to call isAlphabetic(int codePoint), and then maybe isDigit(int codePoint) 填充的 char[] 数组,然后如果其中任何一个为真,则与另一个数据库进行比较,如果两者都为假,则您可能正在处理两个字符集中不同的标点符号或符号,可能会被忽略。
为了使您的比较更加可靠,您可能还需要检查 isWhitespace(int codePoint),因为我看到的一个常见问题是人们从 Microsoft Word 文档或包含非-breaking space (U+00A0
) 并且数据库包含常规 space (U+0020
)。该方法还检查制表符、垂直制表符等。