0

我有一个名为 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 包含 ñ 例如,如果 a 执行以下操作:

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

网页中显示的列的结果将是 ñ ? 或ñ � NVarchar 正确存储数据,但由于某种原因,该函数发生了一些变化。如果我在编码时遇到问题,则 ñ 在这两种情况下都不会正确显示。

4

2 回答 2

1

我有问题。

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

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

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

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

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

于 2013-01-08T14:52:14.667 回答
0

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

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

您还应该准确检查列中存储的内容。在 MySQL 中,我使用十六进制函数来准确显示字段中的字节,但我不确定 SQL Server 的等效项是什么。但是,这个页面告诉我有LENDATALENGTH函数可以用来比较字符数和字节数。找到相当于 MySQL 的hex函数的方法绝对是 g.

于 2013-01-08T08:18:10.397 回答