Informix 11.5 SQL Выбор возврата каретки и перевода строки

Informix 11.5

Я пытаюсь найти символы возврата каретки и перевода строки, которые могут существовать в поле VARCHAR. Во-первых, мне нужен оператор SELECT, чтобы показать, что они существуют. Во-вторых, мне нужно ЗАМЕНИТЬ их пробелом или другим символом. Я перепробовал всевозможные варианты:

CHR(10) + CHR(13)

CHR(10) || CHR(13)

CHAR(13) + CHAR(10)

CHAR(13) || CHAR(10)

SELECT CHR(10) from systables;

Все выдает ошибку: Routine (chr) can not be resolved.

Я искал повсюду и просто не могу найти ничего, что работает, и я уверен, что это безумно глупо легко.


person Gemini    schedule 21.01.2017    source источник


Ответы (2)


Получите пакет ASCII от IIUG

В IDS 11.70 добавлена ​​функция CHR(); его нет в IDS 11.50.

Хорошая новость в том, что вы можете добавить эту функцию, потому что IDS - это расширяемый сервер. Хорошей новостью для вас является то, что вы можете получить соответствующий код на веб-сайте IIUG в Архив ПО в разделе Разное как ascii.

Это должно позволить вам делать то, что вам нужно. (Примечание: я написал код еще когда - до того, как на каком-либо из серверов была встроена поддержка.)

Windows все усложняет

Я загружал файл ascii.unl и получаю сообщение об ошибке, что количество столбцов в строке 13 не совпадает. Вы видели это раньше? Я использую Windows 2008. Ошибки:

  • 846: Number of values in load file is not equal to number of columns.
  • 847: Error in load file line 13.

Я не видел этого раньше, но я не пробовал этот файл в Windows и ... ну, скажем так, в Windows жизнь становится сложнее, чем в Unix (а в Unix это не так просто).

Прежде всего, файл данных должен иметь окончания строк CRLF вместо окончаний строк только для NL, которые являются стандартными для Unix. (Обратите внимание, что NL, новая строка, является другим именем для LF, перевода строки - он же '\n'.) Для большинства строк в файле выгрузки это не проблема.

Две записи, для которых это может быть (есть) проблема, относятся к CR и LF - записи 13 и 10 соответственно. Теоретически, если запись для строки 10 содержит (в строковой нотации C) "10|\\\n\r\n" (то есть 10, вертикальная черта, обратная косая черта, новая строка, CRLF), все должно быть в порядке; отсутствие сообщения об ошибке в строке 10 говорит о том, что все в порядке.

Точно так же запись в строке 13 - "13|\r\r\n", что явно вызывает горе. Самое простое пробное исправление - добавить сюда обратную косую черту: "13|\\\r\r\nn". Обратная косая черта означает, что следующий символ не имеет особого значения. Если это не сработает, нам, вероятно, придется попробовать шестнадцатеричную escape-нотацию: "13|\\0d\r\n" - и использовать dbaccess -X, чтобы включить шестнадцатеричную escape-нотацию.

Если повезет, один из этих двух (или оба) сработает. Если ни один из них не работает, вернитесь, и мы попробуем придумать что-нибудь еще.

person Jonathan Leffler    schedule 21.01.2017
comment
Вау, спасибо, Джонатан, ты даже указал мне прямо на загрузку! И глядя на файлы и SQLCMD, похоже, что вы действительно написали это! Очень мило, сэр. Вопрос: Я загружал файл ascii.unl и получаю сообщение об ошибке, что количество столбцов не совпадает в строке 13. Вы видели это раньше? Я использую Windows 2008. 846: количество значений в загружаемом файле не равно количеству столбцов. 847: Ошибка в строке 13 файла загрузки. - person Gemini; 23.01.2017
comment
Я попытался поставить '\' в строке 13: 13 | \, но ошибка все равно была. Я удалил строку для 13 и загрузил все остальное. Я создал новый файл .unl только с этой строкой: 13|\\0d\r\n Я запустил dbaccess -X, и он вернул эту ошибку: 268: Unique constraint (informix.u2_ascii) violated. 100: ISAM error: du 847: Error in load file line 1. - person Gemini; 23.01.2017
comment
Ворчать ... ай! Строка должна содержать 13|\0d, за которым следует окончание строки CRLF (6 символов ASCII плюс окончание строки Windows). Это то, что обозначено в C-нотации - или, скорее, было предназначено показать. Если это то, что вы пробовали, то мне придется хорошенько подумать. Если это не то, что вы пробовали, можете ли вы попробовать (конечно, вместе с dbaccess -X)? Возможно, вам придется взглянуть на таблицу, чтобы увидеть, есть ли строка с 13 в качестве val. Если есть, проверьте, что содержится в столбце chr, если можете. Но вам может потребоваться удалить строку: DELETE FROM ASCII WHERE val = 13; - person Jonathan Leffler; 23.01.2017
comment
Я просто скопировал 13|\\0d\r\n отсюда в новый файл, зашел в dbaccess -X и загрузил файл. Я просто попробовал другой новый файл с 13|\\\r\r\nn и запустил его в обычном режиме dbaccess, а также получил ошибку Unique constraint. Но, если вы заметили, ограничение на u2, которое является полем 'chr', а не val '13'. Кажется, вы думаете, что значение перевода строки уже там под другим номером? Я не уверен, как попытаться найти его в базе данных? Я пробовал select * from ascii where chr like '%0d\r\n' и тому подобное, но не думаю, что он распознает строку C (что имеет смысл) - person Gemini; 24.01.2017
comment
Разумно предположить, что вход для val, равного 10, является виновником. Просто досадно, что это две ценности, которые вас действительно интересуют! Есть ли у вас контракт на техническую поддержку этой версии Informix с IBM? Если так, то сейчас самое подходящее время для его использования. У вас есть ESQL / C (ClientSDK) и компилятор C на машине? У вас есть JDBC и компилятор Java? Возможно, проще всего обработать эти две записи с помощью (небольшой) программы. По сути: DELETE FROM ASCII WHERE val IN (10, 13); INSERT INTO ASCII VALUES(10, '\n'); INSERT INTO ASCII VALUES(13, '\r');. - person Jonathan Leffler; 24.01.2017
comment
Конечно, необходимо установить соединение, и мы должны быть уверены, что компилятор преобразовал эти последовательности \n и \r в реальные символы, и нам, возможно, придется использовать переменные-заполнители, чтобы избежать путаницы с ifx_allow_newline() и … Это не так просто, как может показаться на первый взгляд, но общая концепция достаточно проста и понятна. - person Jonathan Leffler; 24.01.2017
comment
Я просто хотел обновить и отправил это в IBM 23.01.17. По состоянию на 14.02.17 они не разобрались. :) - person Gemini; 15.02.2017

Согласно моему вышеупомянутому комментарию: я загружал файл ascii.unl и получаю сообщение об ошибке, что количество столбцов не совпадает в строке 13. Вы видели это раньше? Я использую Windows 2008. 846: количество значений в загружаемом файле не равно количеству столбцов. 847: Ошибка в строке 13 файла загрузки.

Вот что я вижу в файле ascii.unl.

ascii.unl

Если я помещу это в MS Word и включу Показать форматирование / знаки абзаца, он покажет следующее:

введите здесь описание изображения

введите здесь описание изображения

person Gemini    schedule 23.01.2017