Skip to main content
Skip table of contents

Besonderheit des NULL-Symbols (U+0000) bei PostgreSQL als Zieldatenbank

Beim Versuch, das NULL-Symbol U+0000 im Textdatentyp von PostgreSQL zu speichern, kommt es zu einer Ausnahme. Sind in Lexware Datensätze vorhanden, die dieses Zeichen enthalten, müssen diese bereinigt werden, bevor eine Synchronisation mit PostgreSQL durchgeführt werden kann.

Die Bereinigung kann über SQL Central erfolgen, indem das Nullzeichen in der betroffenen Spalte durch nichts ersetzt wird.

UPDATE Tabellenname SET Spalte = REPLACE(Spalte, UNISTR('\u0000'), '');

Mit der folgenden Prozedur kann ein UPDATE-Statement generiert werden, welches die Änderungen auf allen Spalten mit VARCHAR-Datentyp anwendet.

SQL
BEGIN
DECLARE my_table_name VARCHAR(128);
DECLARE my_stmt TEXT;
DECLARE my_column_name VARCHAR(128);
DECLARE is_first BIT;
DECLARE column_cursor CURSOR FOR 
    SELECT C.column_name
    FROM SYSCOLUMN C
    INNER JOIN SYSTABLE T ON C.table_id = T.table_id
    WHERE T.table_name = my_table_name AND C.domain_id IN (9, 10, 11, 655);

SET my_table_name = 'Tabellenname';
SET is_first = 1;
SET my_stmt = 'UPDATE ' + my_table_name + ' SET ';

OPEN column_cursor;
FETCH NEXT column_cursor INTO my_column_name;

WHILE @@FETCH_STATUS = 0 LOOP
    IF is_first = 0 THEN
        SET my_stmt = my_stmt + ', ';
    END IF;
    SET my_stmt = my_stmt + my_column_name + ' = REPLACE(' + my_column_name + ', UNISTR(''\u0000''), '''')';
    SET is_first = 0;

    FETCH NEXT column_cursor INTO my_column_name;
END LOOP;

CLOSE column_cursor;
DEALLOCATE column_cursor;

SELECT my_stmt;
END;

Das Statement muss eventuell manuell angepasst werden, da nicht in alle Spalten geschrieben werden kann. Beim Anzeigen des Statements kann es vorkommen, dass zuerst die Kürzungslänge in den Einstellungen erhöht werden muss.

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.