INSERT / SELECT查询

时间:2016-03-14 07:37:23

标签: c# sql-server database

我使用带有排序规则SQL_Latin1_General_CP1_CI_AS的SQL Server 2014。

我有一个C#程序,可以在我的数据库中插入中文字符,例如:

"你","好".

在SQL Server Management Studio中,我可以清楚地看到它,我也可以通过N"你"来搜索它。

问题在于,对于某些角色来说,它并没有起作用:

"〇", "㐄". 

当我的C#程序开始插入这两个字符时,我引发了一个CONSTRAINT UNIQUE异常(因为我把它放到我的数据库中是一个中文字符的唯一约束)。

  

InnerException = {"违反UNIQUE KEY约束' AK_Dictionary_Chinese'。无法在对象' dbo.Dictionary'中插入重复的密钥。重复键值为(㐄)。\ r \ n语句已终止。"

这是我的问题:似乎这两个汉字(我有大约70个类似的问题)没有很好地转换成UTF8而且我遇到了问题。如果我删除了唯一约束,那么当然我可以将它插入到我的数据库中,并可以通过SQL Server Management Studio查看它。但是当我使用N"〇"搜索角色时,数据库会回答我多个匹配:"〇","㐄" ...

那我怎么处理呢?我试图改变中国人的整理,但我有同样的问题......

感谢您的帮助。

我如何在我的c#程序中添加中文字符?

我的实体对象:

public partial class Dictionary
{
    public int Id { get; set; }
    public string Chinese { get; set; }
    public string Pinyin { get; set; }
    public string English { get; set; }
}

我只是将一个新的实体对象添加到我的数据库并调用SaveChanges();

var word1 = new Dictionary()
{
   Chinese = "〇",
   Pinyin = "a",
   English = "b",
};

var word2 = new Dictionary()
{
   Chinese = "㐄",
   Pinyin = "c",
   English = "bdsqd",
};

 // We insert it into our Db
 using (var ctx = new DBEntities())
 {
   ctx.Dictionaries.Add(word1);
   ctx.Dictionaries.Add(word2);
   ctx.SaveChanges();
 }

如果你想在家里试试,这里有一个小的sql脚本可以重现这个问题。您可以通过SQL MANAGEMENT STUDIO执行它:

DECLARE @T AS TABLE
(
    ID INT IDENTITY PRIMARY KEY,
    Value  NVARCHAR(256)
);  

INSERT INTO @T(Value) VALUES (N'〇'), (N'㐄');

SELECT * FROM @T;


SELECT * FROM @T WHERE Value = N'〇';

2 个答案:

答案 0 :(得分:1)

我找到了答案。事实上,汉字是传统的"和SQL SERVER需要一些帮助。整理是正确的想法,但我必须为此指定中国传统(找到它我只是查询提供所有可能的整理的样本....)。

DECLARE @T AS TABLE
(
    ID INT IDENTITY PRIMARY KEY,
    Value  NVARCHAR(256)
) ;  

INSERT INTO @T(Value) VALUES (N'〇'), (N'㐄');

SELECT * FROM @T;

SELECT * FROM @T WHERE Value = N'㐄' COLLATE Chinese_Traditional_Pinyin_100_CI_AS;

很抱歉让你失去了时间,我真的尝试过中文整理而不是传统的整理(我不知道它是传统的角色......)。

固定。

答案 1 :(得分:0)

尝试此操作而不必每次都指定Collat​​ion!

DECLARE @T AS TABLE
(
    ID INT IDENTITY PRIMARY KEY,
    Value  NVARCHAR(256)
) ;  

INSERT INTO @T(Value) VALUES (N'〇'), (N'㐄'), (N'㐄〇'), (N'〇㐄');

SELECT * FROM @T;

SELECT * FROM @T  WHERE CAST(Value AS varbinary) like CAST(N'〇%' AS varbinary)
SELECT * FROM @T  WHERE CAST(Value AS varbinary) like CAST(N'㐄%' AS varbinary)