我有一个名为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正确地存储数据,但由于某种原因,该功能会改变一些东西。 如果我遇到编码问题,则在两种情况下都不会正确显示。
答案 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。
的方法