使用不同的编码在SQL Server中搜索波斯语字符和单词

时间:2014-02-22 17:04:27

标签: sql-server utf-8 persian

我有一个包含波斯语单词的文本文件,该文件使用ANSI编码保存。当我尝试从文本文件中读取波斯语单词时,我会得到一些像'?'这样的字符。为了解决这个问题,我写了一个方法,将文件编码更改为UTF8并重写文本文件。 方法:

    public void Convert2UTF8(string filePath)
    {
        //first, read the text file with "ANSI" endocing
        StreamReader fileStream = new StreamReader(filePath, Encoding.Default);
        string fileContent = fileStream.ReadToEnd();
        fileStream.Close();
        //Now change the file encoding and replace it with the UTF8
        StreamWriter utf8Writer = new StreamWriter(filePath.Replace(".txt", ".txt"), false, Encoding.UTF8);
        utf8Writer.Write(fileContent);
        utf8Writer.Close();
    }

现在第一个问题解决了;但是,主要问题在于: 我想将这些单词插入SQL Server数据库中的表中。我这样做,但每次我想从数据库表中搜索波斯语时,结果为null,而记录确实存在于数据库表中。 找到表格中存在的波斯语的解决方案是什么? 我目前使用的代码就像:

SELECT * FROM [dbo].[WordDirectory] 
WHERE Word = N'کلمه'

'Word'是保存波斯语单词的字段。字段的类型是NVARCHAR。我的SQL服务器版本是2012。 我应该改变整理吗?

2 个答案:

答案 0 :(得分:3)

DECLARE @Table TABLE(Field NVARCHAR(4000) COLLATE Frisian_100_CI_AI)

INSERT INTO @Table (Field) VALUES
(N'همهٔ افراد بش'),
(N'می‌آیند و حیثیت '),
(N'ميشه آهسته تر صحبت کنيد؟'),
(N'روح'),
(N' رفتار')   

SELECT * FROM @Table
WHERE Field LIKE N'%آهسته%'

两个查询返回相同的结果

RESULT Set:  ميشه آهسته تر صحبت کنيد؟

您必须确保在插入值时使用前缀N,以告诉sql server,传递的字符串中可以有unicode字符。在Select语句中搜索字符串时也是如此。

答案 1 :(得分:1)

在搜索过程中,你可能会遇到'ي'和'ك'的波斯语和阿拉伯语版本的问题。这些字符看起来都一样,有不同的Unicode编号:

select NCHAR(1740),  -- Persian ى
       NCHAR(1610),  -- Arabic ي
       NCHAR(1705), -- Persian ك
       NCHAR(1603) -- Arabic ك

更多信息:http://www.dotnettips.info/post/90