当我从表中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
排序规则,我无法更改它们。
谁能给我一个解决方案,如何通过修改列或表来解决这个问题?
最佳答案
为了使其正常工作,您需要执行以下操作:
将应用代码中的输入参数声明为
NVARCHAR
(您已完成此操作)将存储过程中的输入参数声明为
NVARCHAR
(未显示任何代码)在表中插入或更新定义为
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/