У нас есть процесс, который считывает файл XML в нашу базу данных и вставляет в эту таблицу все строки, которых нет в другой таблице.
Этот процесс также имеет триггер для записи в таблицу аудита иночной снимок также хранится в другой таблице.
В таблице хранения XML поле выглядит как 1234567890123456
, но оно существует в нашей активной таблице как 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
.Эти пробелы не будут удалены любой комбинацией функций REPLACE
.Мы перепробовали все значения CHAR
, и он не распознает символ.Однако таблица аудита и ночной снимок содержат правильные значения.
Аналогично, если мы запустим сравнение между SELECT CASE WHEN '1234567890123456' = '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 ' THEN 1 ELSE 0 END
, это вернет 1, поэтому они совпадают.Однако LEN('1234567890123456')
равно 16, а LEN('1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 ')
равно 32.
Мы выполнили несколько запросов, чтобы перебрать символы в поле и вывести значения ASCII и Unicode для символов.Цифры возвращают правильные значения ASCII / Unicode, но этот случайный пробельный символ не возвращает значение.
Примером неправильно отображаемого является 0x35000000320000003800000036000000380000003300000039000000370000003800000037000000330000003000000035000000340000003000000033000000
, а правильное - 0x3500320038003600380033003200300030003000360033003600380036003000
.Оба были добавлены одинаковыми средствами в один и тот же день.У одного есть дополнительные байты, у другого все в порядке.
Как мы можем идентифицировать этого персонажа и избавиться от него?Есть ли причина, по которой это было бы вставлено изначально?Как мы можем избежать этого в будущем?