sql-server - 存储过程将希伯来字符插入 NVARCHAR 列,但 SELECT 显示 "?"

标签 sql-server t-sql unicode collation

当我从表中SELECT时,我存储的数据将存储为问号。

@word是我的存储过程中的一个参数,值来自C#代码:

string word = this.Request.Form["word"].ToString();

cmd.Parameters.Add("@word", System.Data.SqlDbType.NVarChar).Value = word;

我的存储过程是这样的:

CREATE PROCEDURE ....
(
   @word nvarchar(500)
   ...
)

Insert into rub_translate (language_id,name)
values (8 ,@word COLLATE HEBREW_CI_AS )

我的数据库和列正在使用 SQL_Latin1_General_CP1_CI_AS 排序规则,我无法更改它们。

谁能给我一个解决方案,如何通过修改列或表来解决这个问题?

最佳答案

为了使其正常工作,您需要执行以下操作:

  1. 将应用代码中的输入参数声明为 NVARCHAR(您已完成此操作)

  2. 将存储过程中的输入参数声明为 NVARCHAR(未显示任何代码)

  3. 在表中插入或更新定义为 NVARCHAR 的列(您声称情况如此)

使用NVARCHAR时,数据库的默认排序规则是什么并不重要。实际上,使用 NVARCHAR 时,表中列的排序规则是什么并不重要,至少对于正确插入字符而言不重要。

此外,在 INSERT 语句中指定 COLLATE 关键字是不必要的,而且无论如何也没有帮助。如果您将存储过程输入参数定义为 VARCHAR,则字符在进入存储过程时已转换为 ?。如果该列实际上定义为 VARCHAR (您尚未提供表的 DDL),那么如果排序规则不是 Hebrew_* 那么您无能为力(此外,将数据类型更改为 NVARCHAR 或将排序规则更改为 Hebrew_ 之一)。

如果顶部列出的这三项确实到位,那么最后要检查的就是输入值本身。由于这是一个网络应用程序,因此页面本身的编码可能未正确设置。您需要在 cmd.Parameters.Add("@word", System.Data.SqlDbType.NVarChar).Value = word; 行设置一个断点,并确认该值保存在word 变量包含希伯来字符而不是 ?s。

另外:您不应该在未指定最大长度/大小的情况下创建字符串参数。默认值为 30(在本例中,有时为 1),但存储过程中的参数定义为 NVARCHAR(500)。这可能会导致静默截断(“静默”意味着它不会导致错误,它只会截断值)。相反,您应该始终指定大小。例如:

cmd.Parameters.Add("@word", System.Data.SqlDbType.NVarChar, 500).Value = word;

关于sql-server - 存储过程将希伯来字符插入 NVARCHAR 列,但 SELECT 显示 "?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42926256/

相关文章:

SQL 检查时间是否出现在某些时间段之间

sql-server - 清除 SQL 表最快的方法是什么?

sql - 如何在 SQL Server 中对包含数字和字母的 varchar 列进行排序?

sql - MySQL IN 运算符

Git 在行标准化后插入 unicode 字符

python - 如何在 python 中正确打印 unicode 字符列表?

c# - 如何高效地修剪数据

sql-server - 由于加密消息,无法将存储过程添加到数据库

SQL Server Management Studio 2012 - 从表导出/导入数据

linux - 在 perl 上打印包含 utf-8 字节序列的字符串