当前位置: 首页 > 知识库问答 >
问题:

插入/选择查询时的SQL Server和中文字符

满博
2023-03-14

我使用SQL服务器2014与排序SQL_Latin1_General_CP1_CI_AS

我有一个C#程序,可以将汉字插入我的数据库,例如:

"你","好".

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

问题是,对于某些角色来说,它不起作用:

"〇", "㐄". 

当我的C#程序开始插入这两个字符时,我引发了一个约束唯一异常(因为我将它作为汉字的唯一约束放入数据库)。

InnerException={“违反了唯一键约束“AK_Dictionary_Chinese”。无法在对象“dbo.Dictionary”中插入重复键。重复键值为(㐄).\r\n语句已终止。“

这是我的问题:这两个汉字(我有大约70个类似的问题)似乎没有很好地转换成UTF8,我遇到了这个问题。如果我删除了唯一约束,那么我当然可以将其插入数据库,并通过SQLServerManagementStudio查看它。但当我使用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个答案

酆出野
2023-03-14
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)
厍书
2023-03-14

我找到了答案。事实上,汉字是“传统的”,SQLSERVER需要一点帮助。归类是正确的想法,但我必须指定中国传统的(找到它,我只是查询提供的所有可能的归类样本......)。

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;

很抱歉浪费了你的时间,我真的试着用中文整理,但不是传统的(我不知道这是繁体字...)。

固定的

 类似资料:
  • 问题内容: 我正在研究SQL Server存储过程。我有一个表“ User”,其中包含字段(ID,名称,电子邮件,地址)。 我有以下查询返回所有用户 它返回所有用户,但是我只想在返回之前将以下虚拟用户插入到结果记录中。 用户=> ID = 0,名称=“全部” 该记录不会出现在数据库中,但是在返回结果时,我想将此记录作为第一个记录插入,然后插入其余用户。我试图找到这样的东西,但徒劳无功。 问题答案:

  • 问题内容: 我有一个查询,看起来像这样: 这是一个非常基本的查询。除了提取Item的值之外,我还想将其他值添加到混合中,然后将其返回给我。在原始SQL中,我会这样做: 如何通过sqlalchemy手动添加该值? 问题答案: 您需要使用,看起来有点像这样: 注意,该参数无需任何转换即可插入查询;如果您从应用程序外部接受text参数的值,则可能使您暴露于SQL Injection漏洞。如果这是您需要的

  • 问题内容: 有没有办法插入预设值和我从选择查询中获得的值?例如: 我有“字符串”的值和数字5,但是我必须从这样的选择中找到[int]值: 那给我那个ID放在table1里面。 如何将其合并为一个语句? 问题答案: 使用查询,并将已知值放入:

  • 我有下一个关系(只是示例)用户0/1-*故事当我想获得包含用户的故事列表时,我会进行下一个查询。 我注意到ef向db发出了额外的请求以获取用户(但这不应该是因为我使用了include)。没有AsNoTrack(),一切都很好。 看起来这是一个可为null的关系问题,因为不允许为null的关系可以很好地工作。 有人有类似的问题吗?可能是“允许空”关系的预期行为。

  • 问题内容: 我的SQL代码如下: 等效的linq表达式是什么? 问题答案: 我第一次尝试在 来源 LINQ to SQL中的NOT IN子句

  • 我在java中有两个类,分别是txn和txnID,我想从嵌入表中检索txnID值,下面是我的txn类结构: 以下是嵌入式类结构: 我的查询语句如下: 错误消息如下: