从 SQL Server 读取 nvarchar 时带菱形的问号

Posted

技术标签:

【中文标题】从 SQL Server 读取 nvarchar 时带菱形的问号【英文标题】:Question mark with diamond when read nvarchar from SQL Server 【发布时间】:2020-10-01 05:21:35 【问题描述】:

我在这里遇到了一个很奇怪的问题。

我需要从 SQL Server(2016 版)读取数据。像O'Neal 这样的名字。

当我在 IDE/TextEditor 中加载字符串时,O'Neal 可以正确读取为O'Neal

但是当我将程序打包为 jar 或 war 文件时,O'Neal 会像这样 O��Neal 加载。

我不知道这是怎么发生的。任何建议将不胜感激。谢谢。

【问题讨论】:

加载是什么意思?您是否尝试在某处打印该值?如果实际文本使用 UTF-8 编码,请确保在显示文本时使用相同的编码。 @ShashankKadne 抱歉缺少信息。是的,我在控制台中打印它们。实际上,我不确定编码,我检查了SELECT SERVERPROPERTY('Collation'),它返回 SQL_Latin1_General_CP1_CI_AS 【参考方案1】:

参考this question

就像@Arvind 所说,它在 IDE/Editor 中可以正常运行,因为它已经被编码为 UTF-8。

但是,jar 或 tomcat 不是,因此我们必须确保它以 UTF-8 编码运行。

    在 Windows 10 CMD 中,jar 文件可以这样运行:

> java -Dfile.encoding="UTF-8" -jar test.jar

但是这个命令无法在 PowerShell 中运行,我不知道为什么这是另一个问题。

    如果你想在tomcat服务器上运行war文件,在pathToTomcat/bin,用编辑器打开catalina.bat

添加set "JAVA_OPTS=%JAVA_OPTS% -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8"

【讨论】:

以上是关于从 SQL Server 读取 nvarchar 时带菱形的问号的主要内容,如果未能解决你的问题,请参考以下文章

Linq - 从 SQL Server 中的 nvarchar 类型列中查找最大值

Oracle 和 SQL Server 中的 NVARCHAR 之间的区别?

SQL Server:从包含json字符串的nvarchar(max)变量中获取所有字符串出现(标记)

SQL Server 算术溢出错误 - 将 nvarchar 转换为 datetime

NVARCHAR 存储 SQL Server 上 UCS-2 编码不支持的字符

Spring JDBC for SQL Server - 使用 SQLXML 数据类型产生 SQLServerException:不允许从数据类型 xml 到 nvarchar(max) 的隐式转换