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,

Другие вопросы по тегам