Java SQL Server函数返回� 对于特殊字符utf-8

Java SQL Server函数返回� 对于特殊字符utf-8,java,sql-server-2005,jdbc,utf-8,Java,Sql Server 2005,Jdbc,Utf 8,我有一个表,其中有一个名为mydata的字段,类型为nvarcharmax。这包含像:éáñ这样的字符。 使用JavaSpring提取数据。java应用程序使用utf-8进行请求和响应 当我执行一个简单的选择时,特殊字符会正确显示 Select myData from myTable 我有一个简单的SQL函数,它刚刚收到一个nvarchar并返回它 CREATE function getIt (@mydata nvarchar(max) ) returns nvarchar(max) as b

我有一个表,其中有一个名为mydata的字段,类型为nvarcharmax。这包含像:éáñ这样的字符。 使用JavaSpring提取数据。java应用程序使用utf-8进行请求和响应

当我执行一个简单的选择时,特殊字符会正确显示

Select myData from myTable
我有一个简单的SQL函数,它刚刚收到一个nvarchar并返回它

CREATE function getIt (@mydata nvarchar(max) )
returns nvarchar(max)
as
begin
    return @mydata;
end
当我对特殊字符使用函数时,不显示,并被替换为� 象征

Select dbo.getIt(myData) as myData from myTable
我使用mySQL和Oracle测试了相同的过程,在这种情况下,SQL函数不会改变特殊字符。 我正在Ubuntu Linux系统中使用Tomcat。数据库是SQLServer2005。我使用的是JDTS1.3

谢谢你的帮助

额外解释

例如,如果字段myData包含ñ,则如果执行以下操作:

Select
myData,
dbo.getIt(myData) as myData2
from myTable
网页中显示的列的结果将是ñ?奥涅� NVarchar正确地存储了数据,但由于某些原因,该函数会更改某些内容。
如果我在编码方面有问题,那么在这两种情况下,ñ永远不会正确显示。

这是Unicode替换字符。如果您告诉应用程序将数据库中的字节解释为UTF-8,但为其提供拉丁语-1或其他字符集,则可能会发生这种情况。我认为nvarchar意味着数据存储为UTF-16,对吗?我不太喜欢SQL server

连接到数据库后,解释连接的元数据,并查看正在使用的字符集

您还应该准确地检查列中存储的内容。在MySQL中,我使用了一个十六进制函数来精确显示字段中的字节,但我不确定SQL Server的等效值是多少。但是,告诉我有LEN和DATALENGTH函数可以用来比较字符数和字节数。找到与MySQL的十六进制函数等价的函数绝对是实现g的方法。

我遇到了问题

出于某种原因,JDBO将对nvarchar的常规选择捕获为类型12 VARCHAR。 但同时返回nvarchar的函数被捕获为类型-1 LONGVARCHAR

MySQL和Oracle以不同的方式工作,我的Java代码最初是为这个数据库编写的

另一种情况是nVarchar400将返回类型12 VARCHAR,但nVarcharMAX将返回类型-1 LONGVARCHAR

我的代码在二进制文件和SQL Server进入此循环时处理所有长值


感谢@jlordo和@chooban指导我找到解决方案。

您是否100%确定数据库中的数据正确?你的产出在哪里?你到底在哪里看到的?除了这些特殊字符之外?@jlordo 100%确保数据库中的数据是正确的,SQL Server Manager Studio会正确显示这些数据,无论是否使用该功能。输出是一个web应用程序,我看到的是?取而代之,但仅当函数返回数据时,否则它在网页中显示OK。您能否以某种方式缩小错误的来源?例如,在将值显示在网页上之前记录该值:如果日志中的值错误,则您的函数返回的值是错误的;如果日志中的值是正确的,则您的Web应用程序将其搞乱。但是要小心实现正确的日志记录,以避免出现假阴性。@jlordo在缩小问题范围的同时,我得到了下面包含的解决方案。谢谢,真奇怪。如果我使用SQL Server,我会记住这一点。