首页 > 解决方案 > 如何在 Microsoft SQL 查询的参数化 XQuery 表达式中使用 unicode 字符

问题描述

我在 SQL 中有一个将 Unicode 字符作为输入的 XPath 表达式。我需要参数化查询以防止 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 Provider 是 Apache OpenJPA。

在 servlet 中打印 form 参数时,它无法识别 unicode 字符(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 hiứj (正确为 UTF-8 格式),但查询仍然没有返回任何结果。

当我使用 PreparedStatement 尝试相同的事情时,我得到了结果。我只有在使用 nativeQuery 时才会遇到这个问题,但我只能使用 jpa。我怀疑我的 jpa 提供程序不支持 unicode 字符。

有人可以帮忙吗?是否有任何属性要添加到我的数据源以支持 UTF-8 字符?

标签: sql-serverjpaunicode

解决方案


推荐阅读