无法通过SQL查询插入Char(63)

时间:2018-12-31 10:09:09

标签: c# sql-server linq ascii

我能够在SQL数据库中插入不寻常的字符(返回63),没问题。

Letsay ProductName =ኣድድድ

然后如果我想再次插入,但首先检查数据库中是否存在产品名

var product = db.Products.Where(x => x.Productname == txtproduct.Text.Trim()).FirstOrDefault();

然后返回,因为已经有相同的产品名称 我的意思是

if(product == null)
{
   Products pr = new Producst();
   pr.ProductName = txtProductname.txt.trim() // tried even without trim()
   db.Products.Add(pr);
   db.Savechanges();    
}
else
{
    MessageBox.Show("There is the same productname registred"); // Returns allways this one , doesnt't matter which unusual character 
}

即使我写另一个不寻常的字符,例如 productname =ሰግግግ,然后返回“注册了相同的产品名称”。 实际上,当我键入它们时,它们不是相同的单词,但是当我检查其ascii代码时,它们将返回63。

我不希望数据库中有重复的产品名称。有什么办法解决这个问题?请帮忙!

4 个答案:

答案 0 :(得分:3)

ASCII码63是问号?。这意味着文本无法在当前varchar字段中表示,并且所有不支持的字符都转换为问号。您要么需要使用支持这些符号的排序规则来更改排序规则,要么最好将列的数据类型从varchar更改为nvarchar,以便能够存储Unicode字符。

答案 1 :(得分:0)

嗨,我的查询工作是在第一个查询中重现错误(重复)

CREATE TABLE #MyTable  
(PrimaryKey   int PRIMARY KEY,  
   CharCol      varchar(10) COLLATE Finnish_Swedish_CI_AS NOT NULL,
   CONSTRAINT UC_CharCol UNIQUE (CharCol)  
  );  
GO  

INSERT INTO #MyTable 
SELECT 1, 'ኣድድድ'
INSERT INTO #MyTable 
SELECT 2, 'ኣድድኣ'
INSERT INTO #MyTable 
SELECT 3, 'ኣድኣ'

SELECT * FROM #MyTable


DROP TABLE  #MyTable

结果是:

PrimaryKey  CharCol
    3   ???
    1   ????

错误:

    (1 ligne affectée)
Msg 2627, Niveau 14, État 1, Ligne 10
Violation de la contrainte UNIQUE KEY « UC_CharCol ». Impossible d'insérer une clé en double dans l'objet « dbo.#MyTable ». Valeur de clé dupliquée : (????).

但是当我尝试使用排序规则'Finnish_Swedish_100_CI_AS_SC'并使用指定的N'specialcharstring'时,它们的效果很好:

CREATE TABLE #MyTableBis  
  (PrimaryKey   int PRIMARY KEY,  
   CharCol      nvarchar(10) COLLATE Finnish_Swedish_100_CI_AS_SC NOT NULL,
   CONSTRAINT UC_CharCol UNIQUE (CharCol)  
  );  
GO  

INSERT INTO #MyTableBis 
SELECT 1, N'ኣድድድ'
INSERT INTO #MyTableBis 
SELECT 2, N'ኣድድኣ'
INSERT INTO #MyTableBis 
SELECT 3, N'ኣድኣ'

SELECT * FROM #MyTableBis


DROP TABLE  #MyTableBis

结果:

PrimaryKey  CharCol
3            ኣድኣ
2            ኣድድኣ
1            ኣድድድ

来源:

  1. How to store unicode characters in SQL Server?
  2. https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-2017

用于在Entity Framework上使用: EntityFramework update or insert Chinese or non-English text

答案 2 :(得分:0)

我测试并确认,仅搜索一个记录时,我会同时获得两个记录……这行得通吗?使用UNICODE()

Create Table #tbl
(
f1 nVarChar(25)
)
Insert Into #tbl Values
(N'ኣድድድ'),
(N'ሰግግግ')


Select  
* 
From #tbl
Where  UNICODE (f1) = UNICODE (N'ኣድድድ')

更新:Unicode仅找到第一个字符。如果您可以将搜索条件解析为单个字符,则可能会起作用。

要查找“ኣድድድ”

Select  f1 From #tbl
Where  
   Unicode(substring(f1,1,1)) = 4771 And
   Unicode(substring(f1,2,1)) = 4853 And
   Unicode(substring(f1,3,1)) = 4853 And
   Unicode(substring(f1,4,1)) = 4853 

答案 3 :(得分:0)

我认为使用在我的计算机上运行良好的相关代码可能会导致Linq错误:

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                TESTEntities db = new TESTEntities();
                List<MyTableBis2> myDataList = db.MyTableBis2.ToList();
                string valuerFull = "";
                foreach (MyTableBis2 data in myDataList)
                {
                    valuerFull += data.CharCol + " ";
                }
                MessageBox.Show(valuerFull);
                var newValueAdd = textBox1.Text.Trim();

                MessageBox.Show(newValueAdd);

                var ch = myDataList.FirstOrDefault(x => x.CharCol.Equals(newValueAdd));
                if (ch == null)
                {
                    MyTableBis2 m = new MyTableBis2();
                    m.CharCol = textBox1.Text.Trim();
                    db.MyTableBis2.Add(m);
                    db.SaveChanges();
                }
                else
                {
                    MessageBox.Show("This product exist");
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                Exception innerE = ex.InnerException;
                while (innerE != null)
                {
                    MessageBox.Show(innerE.Message);
                    innerE = innerE.InnerException;
                }
            }
        }

等待您退货,看看是否有效