SQL Server函数返回 表示特殊字符utf-8

时间:2013-01-07 23:38:04

标签: java sql-server-2005 jdbc utf-8

我有一个名为mydata的字段,其类型为nvarchar(max)。其中包含以下字符:éáñ。 使用Java(Spring)提取数据。 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。数据库是SQL Sever 2005.我使用的是JDTS 1.3。

感谢您的帮助。

额外说明

如果字段myData包含ñ,例如,如果执行此操作:

Select
myData,
dbo.getIt(myData) as myData2
from myTable

网页中显示的列的结果将是?或者ñ NVarchar正确地存储数据,但由于某种原因,该功能会改变一些东西。 如果我遇到编码问题,则在两种情况下都不会正确显示。

2 个答案:

答案 0 :(得分:1)

我遇到了问题。

由于某种原因,JDBO将常规选择nvarchar作为type(12)VARCHAR捕获。 但是也返回nvarchar的函数是捕获类型(-1)LONGVARCHAR。

MySQL和Oracle以不同的方式工作,我的Java代码最初用于此数据库。

另一种情况是nVarchar(400)将返回type(12)VARCHAR但nVarchar(MAX)将返回type(-1)LONGVARCHAR。

我的代码正在处理所有“LONG”值作为二进制文件,SQL Server进入此循环。

感谢@jlordo和@chooban指导我解决问题。

答案 1 :(得分:0)

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

一旦建立了与数据库的连接,解释连接的元数据并查看正在使用的字符集。

您还应该确切地检查列中存储的内容。在MySQL中,我使用 hex 函数来准确显示字段中的字节,但我不确定SQL Server的等价物是什么。但是,this page告诉我有 LEN DATALENGTH 函数可用于比较字符数和字节数。找到等同于MySQL的 hex 函数绝对是g。

的方法