AS400 SQL Script для файла параметров возвращает
Я интегрирую приложение в AS400 с помощью драйвера Java/JT400. У меня возникла проблема при извлечении данных из файла параметров - полученные данные, кажется, закодированы.
SELECT SUBSTR(F00001,1,20) FROM QS36F."FX.PARA" WHERE K00001 LIKE '16FFC%%%%%' FETCH FIRST 5 ROWS ONLY
Выход
00001: C6C9D9C540C3D6D4D4C5D9C3C9C1D34040404040, - 1
00001: C6C9D9C5406040C3D6D4D4C5D9C3C9C1D3406040, - 2
Как я могу преобразовать это в читаемый формат? Есть ли функция, которую я могу использовать для декодирования этого?
На терминальном подключении к AS400 информация отображается правильно через тот же SQL-запрос.
У меня нет опыта работы с AS400 до этого, и я мог бы действительно помочь. Эта проблема только с файлами параметров. Таблицы базы данных работают нормально.
4 ответа
То, что вы видите, это вывод EBCDIC вместо ASCII. Это связано с тем, что CCSID не указан в базе данных, как указано в других ответах. Идеальным решением является назначение CCSID для вашего поля в базе данных. Если у вас нет возможности сделать это и вы не можете убедить ответственных за это, то должно также работать следующее решение:
SELECT CAST(SUBSTR(F00001,1,20) AS CHAR(20) CCSID(37))
FROM QS36F."FX.PARA"
WHERE K00001 LIKE '16FFC%%%%%'
FETCH FIRST 5 ROWS ONLY
Замените CCSID на тот, который вам нужен. Определения CCSID можно найти здесь: https://www-01.ibm.com/software/globalization/ccsid/ccsid_registered.html
Поскольку файл находится в QS36F, я бы предположил, что этот файл является плоским файлом, а не определен извне... поэтому данные в файле должны интерпретироваться вручную, если к ним обращаются через SQL.
Вы можете попробовать преобразовать поле после его подстроки в символьный формат.
(У меня нет удобного файла S/36, поэтому я действительно не могу его попробовать)
Большое спасибо за все предоставленные ответы, все они правильные.
Это простой файл параметров в AS400, и я не могу ничего менять в системе. Так что это должно быть во время выполнения SQL-запроса или после получения.
Я понятия не имел о том, что такое кодовая страница, так как у меня нет опыта работы с AS400 и файлами в нем. Следовательно, все ваши ответы помогли решить и просветить меня в этом.:)
Итак, лучший ответ - последний. Я изменил SQL следующим образом и получаю желаемый результат.
SELECT CAST(F00001 AS CHAR(20) CCSID 37) FROM QS36F."FX.PARA" WHERE K00001 LIKE '16FFC%%%%%' FETCH FIRST 5 ROWS ONLY
00001: ПОЖАРНЫЙ КОММЕРЧЕСКИЙ, - 1 00001: ПОЖАРНЫЙ - КОММЕРЧЕСКИЙ -, - 2
Еще раз спасибо.
Dilanke
Это шестнадцатеричное число байтов текста в EBCDIC, кодировке AS/400.
static String fromEbcdic(String hex) {
int m = hex.length();
if (m % 2 != 0) {
throw new IllegalArgumentException("Must be even length");
}
int n = m/2;
byte[] bytes = new byte[n];
for (int i = 0; i < n; ++i) {
int b = Integer.parseInt(hex.substring(i*2, i*2 + 2), 16);
bytes[i] = (byte) b;
}
return new String(bytes, Charset.forName("Cp500"));
}
прохождение "C6C9D9C540C3D6D4D4C5D9C3C9C1D34040404040".
Преобразуйте файл с Cp500 в качестве charset:
Path path = Paths.get("...");
List<String> lines = Files.readAllLines(path, Charset.forName("Cp500"));
Для концов строк, которые в AS/400 обозначены как NEL char U+0085, можно использовать регулярное выражение:
content = content.replaceAll("\\R", "\r\n");
Регулярное выражение \R
будет соответствовать ровно одному разрыву строки, будь то \r, \n, \r\n, \u0085
,