C# проблема кодировки, символ '' 'приводит к'? ' - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть программа C#, в которой я сохранил длинный запрос SQL в файле ресурсов (sql .resx).

В моем запросе есть специальный символ валюты (¤ ). Когда моя программа получает запрос из файла ресурсов и выполняет его на сервере SQL, символ валюты (¤) отображается как неподдерживаемый символ. При добавлении символа ¤ к результату он выглядит как вместо ¤.

. Для меня это похоже на проблему с кодировкой в ​​C#.

Вот выдержка из запрос, где все правильно:

    and tb.beward = b.beward and tb.beroom = b.beroom and tb.beidnr = b.beidnr
    and wp.wpspecialbranch = c.tunnus
and ((b.beward + '¤' + b.beroom + '¤' + b.beidnr) LIKE @SCHEDULE

        and 
        ((tb.beward + '¤' + tb.beroom + '¤' + tb.beidnr) LIKE @SCHEDULE))

И вот что я наблюдаю:

    and tb.beward = b.beward and tb.beroom = b.beroom and tb.beidnr = b.beidnr
    and wp.wpspecialbranch = c.tunnus
and ((b.beward + '�' + b.beroom + '�' + b.beidnr) LIKE @SCHEDULE

        and 
        ((tb.beward + '�' + tb.beroom + '�' + tb.beidnr) LIKE @SCHEDULE))

enter image description here

Это происходит, когда я копирую запрос из режима отладки и вставляю в SQL Server Management Studio.

Примечание: Несколько дней назад он работал нормально на моем сервере, но сейчас не работает , Должно быть, на моем сервере произошли некоторые изменения, но я не уверен, что.

Ответы [ 2 ]

4 голосов
/ 21 апреля 2020

Я думаю, что здесь есть две проблемы.

Во-первых, на SQL сервере строковые литералы с широкими символами требуют префикса N:

b.reward + N'¤'

Во-вторых, кодировка символов для файла * .resx, вероятно, неправильная, или вы по крайней мере видите символ в окне, даже если Sql Сервер не прочитал его должным образом.

Если бы это работало несколько дней go, возможно, кто-то открыл и сохранил файл с программой, которая знает только, как сделать ASCII, и ваш специальный символ был искажен. Вам нужно будет исправить файл.

Если это произошло из окна отладки Visual Studio, которое печально известно тем, что искали значения, пытаясь быть «полезным», вы можете даже не искать в нужном месте.


У меня также есть три вопроса для вас отдельно от вопроса.

Глядя на SQL, это не будет хорошо работать. Происходящая здесь конкатенация делает любые индексы в этих столбцах бесполезными. Вы получите намного лучшую производительность ... возможно, на несколько порядков, если вы структурируете запрос так, чтобы не требовалось объединять эти столбцы. По крайней мере, возможно вычисляемый столбец с индексом FULL-TEXT мог бы сделать этот запрос значительно быстрее.

Логически SQL также выполняет дополнительную работу. Если столбцы beward, beroom, beidnr уже совпадают между двумя таблицами, вам нужно только объединить и проверить ОДНУ из них на входе @SCHEDULE. Они имеют одинаковые значения, поэтому, если одно соответствует (или нет), другое должно иметь тот же результат.

В будущем, пожалуйста, ВСТАВЬТЕ КОД в свой вопрос. Изображения здесь не так хороши. Это также экономит вашу работу.

0 голосов
/ 21 апреля 2020

В SQL Сервер

Вам необходимо использовать тип данных Nvarchar, который может хранить символы Unicode.

Чтобы объявить строковый литерал как nvarchar, вам необходимо добавить к нему префикс N ' без него это просто нормальный варчар. Varchars допускают только символы в указанном базовом сопоставлении.

b.reward + N'¤'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...