Невозможно определить странный символ пробела в таблице MSSQL - PullRequest
0 голосов
/ 24 октября 2018

У нас есть процесс, который считывает файл 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.Оба были добавлены одинаковыми средствами в один и тот же день.У одного есть дополнительные байты, у другого все в порядке.

Как мы можем идентифицировать этого персонажа и избавиться от него?Есть ли причина, по которой это было бы вставлено изначально?Как мы можем избежать этого в будущем?

1 Ответ

0 голосов
/ 26 октября 2018

Ввод данных

Похоже, что некоторые нулевые (то есть Char (0)) символы попали в данные.

Если данные должны были быть ASCIIкогда он был введен, но были получены данные UTF-16, тогда это может быть:

Введенные коды символов: 48 00
Отправлено в базу данных: 48 00 00 00

Чтобы избежать этого, удалите запрещенные символы в качестве первого шага при обработке ввода, скажем, с помощью регулярного выражения для замены [\ x00- \ x1F] пустой строкой.

Восстановление данных

Поиск записей, в которых есть Char (0), чтобы подтвердить, что их можно найти таким образом.

В этом случае замените Char (0) пустой строкой.

Если это не работает, вы можете преобразовать данные в формат «0x35000000320000003800000036000000380000003300000039000000370000003800000037000000330000003000000035000000340000003000000033000000», заменить «000000» с «00», а затем преобразовать обратно.

...