0

Я хочу, чтобы иметь возможность идентифицировать проблемные символы в строке, сохраненной на моем SQL-сервере, используя LINQ to Entities.Идентифицировать проблемные символы в строке

Проблемные символы - это символы, которые имели проблемы в процессе кодирования.

Это пример проблемной строки: "testing stringá א ç".

В приведенном выше примере только символ считается проблематичным.

Так, например, следующая строка не считается проблематичной: «testingstringá א ç». Как я могу проверить этот Varchar и определить, что в нем есть проблематичные символы?

Обратите внимание, что мое предпочтительное решение - идентифицировать его с помощью запроса LINQ to entities, но другие решения также приветствуются - например: может быть какая-то процедура магазина?

Я пытался играть с Regex и с «LIKE» заявление, но без успеха ...

+0

не будет лучший способ справиться с этим путем избежать добавления в базу данных проблемного строки? Я имею в виду, установите правильное кодирование символов (например, «utf-8»). –

+0

В принципе, вы правы, но обратите внимание, что в моей ситуации может быть несколько сценариев, которые могут вызвать подобные проблемы. Моя цель - создать оповещение об ошибке, которое будет уведомлять об этих ошибках для дальнейшего изучения и обработки. –

+0

Unicode! = "Проблемные символы". База данных и ваш язык выбора поддерживают ее, вы также можете захотеть. – JerKimball

ответ

1

.Net и NVARCHAR используют Unicode, поэтому нет ничего изначально «проблемного» (по крайней мере, для символов BMP).

Таким образом, вы должны сначала определить, что «проблемные» в виду в виду:

  • символы не отображаются в целевой кодировок

Просто конвертировать между кодировками и проверить, является ли потеряно данные:

CONVERT(NVARCHAR, CONVERT(VARCHAR, @originalNVarchar)) = @originalNVarchar 

Обратите внимание, что вы можете использовать сортировки SQL Server, используя предложение COLLATE, а не используя сортировку базы данных по умолчанию.

  • символы не могут быть отображены из-за шрифтов используется

Это не может быть легко сделано в .Net

+0

Ницца, это работает! Благодаря! –

2

Отъезд the Encoding class.

У этого есть DecoderFallback Property и EncoderFallback Property, который позволяет обнаруживать и заменять плохие символы, найденные во время декодирования.

+0

Решение, которое вы описали, немного проблематично в отношении структуры сущности.Решение, предлагаемое ниже @devio, работает в стороне SQL-SQL, но служит моей цели. Еще раз спасибо! –

1

Вы можете сделать что-то вроде этого:

DECLARE @StringWithProblem NVARCHAR(20) = N'This is '+NCHAR(8)+N'roblematic'; 
DECLARE @ProblemChars NVARCHAR(4000) = N'%['+NCHAR(0)+NCHAR(1)+NCHAR(8)+']%'; --list all problematic characters here, wrapped in %[]% 

SELECT PATINDEX(@ProblemChars, @StringWithProblem), @StringWithProblem; 

Это дает индекс первого проблемного символа или 0, если ничего не найдено.

+0

Я понимаю ваше решение, оно, вероятно, сработает, но я хотел найти более общее решение - например, такое, которое предлагалось выше @devio. Спасибо –

Смежные вопросы