Как использовать символы Юникода в параметризованных выражениях XQuery в запросах Microsoft SQL - PullRequest
1 голос
/ 02 июля 2019

У меня есть выражение XPath в SQL, которое принимает символы Unicode в качестве входных данных. Мне нужно параметризировать запрос, чтобы предотвратить внедрение SQL.

При передаче символов Unicode они появляются как ? вместо реальных символов. Таким образом, при передаче строки в качестве параметра в запрос, запрос не возвращает никаких результатов. Фактическая строка - это «abcồn dnưf hiứj», которая является пользовательским вводом из формы, но при передаче в качестве параметра в запрос символы Unicode заменяются на ?, как указано ниже.

declare @name NVARCHAR(100)=?;
SELECT 
    * 
FROM 
    dbo.EMPLOYEE_DETAILS 
WHERE 
    EMPLOYEE_DETAILS.EMP_XML.value('(/map/name)[1]', 'nvarchar(max)') like @name

Когда запрос печатается в JPA, параметры печатаются, как показано ниже.

[params=(String) %abc?n de?f hi?j%]

Добавление еще нескольких деталей.

Используемый сервер - WebSphere Application Server 8.5, а провайдер JPA - Apache OpenJPA.

Когда параметр формы печатается в сервлете, он не распознает символы Юникода (abcễn печатается как abc? N). Приведенный выше nativeQuery не дал никаких результатов, поскольку в базе данных не было строки типа abc? N. Поэтому я добавил следующую запись в файл web.xml и следующие свойства в Websphere Application Server.

Пользовательские свойства:

client.encoding.override = UTF-8 file.encoding = UTF-8

web.xml

<filter>  
<filter-name>encodingFilter</filter-name>  
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
<init-param>  
   <param-name>encoding</param-name>  
   <param-value>UTF-8</param-value>  
</init-param>  
<init-param>  
   <param-name>forceEncoding</param-name>  
   <param-value>true</param-value>  
</init-param>  

<filter-mapping>  
<filter-name>encodingFilter</filter-name>  
<url-pattern>/*</url-pattern>  

После добавления этой записи, когда я печатал строку, они были напечатаны в кодировке UTF-8, например, abcá »« dn f ° f hiá »© j (правильно в формате UTF-8), но все равно запрос не возвращает никаких результатов. ,

Когда я пытаюсь сделать то же самое с помощью PreparedStatement, я получаю результаты. Я сталкиваюсь с проблемой только тогда, когда я использую nativeQuery, но я должен использовать только jpa. Я подозреваю, что мой провайдер jpa не поддерживает символы Юникода.

Может кто-нибудь помочь с этим? Можно ли добавить какое-либо свойство в мой источник данных для поддержки символов UTF-8?

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