Sql server SQL Server 2012中的字符编码

Sql server SQL Server 2012中的字符编码,sql-server,unicode,encoding,Sql Server,Unicode,Encoding,我有一个数据库(SQL Server 2012),其中包含大量Unicode数据。从web应用程序插入的记录,但字符以web字符编码“western”保存,但它们是Unicode 当这些数据显示在浏览器中时,浏览器会自动将其字符编码更改为“Unicode”,并正确显示字符,但我希望在我的应用程序中使用这些数据,并希望将它们更改为真正的Unicode字符 例如,字符保存在如下表格中(使用“western”编码): 我想将它们转换为unicode编码,如下所示: پیشرفت 50 درصدی مخ

我有一个数据库(SQL Server 2012),其中包含大量Unicode数据。从web应用程序插入的记录,但字符以web字符编码“western”保存,但它们是Unicode 当这些数据显示在浏览器中时,浏览器会自动将其字符编码更改为“Unicode”,并正确显示字符,但我希望在我的应用程序中使用这些数据,并希望将它们更改为真正的Unicode字符

例如,字符保存在如下表格中(使用“western”编码):

我想将它们转换为unicode编码,如下所示:

پیشرفت 50 درصدی مخزن ذخیره آب بوشهر  

正如Martin Smith和marc_s所解释的,如果要使用unicode字符,则需要使用
NVARCHAR
数据类型。 或者您可以将
VARCHAR
数据类型与特定的阿拉伯语排序规则一起使用,如下所示

CREATE TABLE #TestTable
(
Column1 VARCHAR(100) COLLATE Latin1_General_100_CI_AI,  --<-- VARCHAR Column with Default Collation
Column2 VARCHAR(100) COLLATE Arabic_CI_AI_KS_WS,        --<-- VARCHAR Column with Arabic Collation
Column3 NVARCHAR(100),                                  --<-- NVARCHAR Column with Default Collation
Column4 NVARCHAR(100) COLLATE Arabic_CI_AI_KS_WS        --<-- NVARCHAR Column with Arabic Collation
)
INSERT INTO #TestTable 
VALUES(N'پیشرفت 50 درصدی مخزن ذخیره آب بوشهر'
       ,N'پیشرفت 50 درصدی مخزن ذخیره آب بوشهر'
       ,N'پیشرفت 50 درصدی مخزن ذخیره آب بوشهر'
       ,N'پیشرفت 50 درصدی مخزن ذخیره آب بوشهر')

SELECT * FROM #TestTable

存储此数据的列是什么数据类型?为了存储和成功检索Unicode字符,必须使用
NVARCHAR
列。如果它们显示在网页上,则必须正确存储。问题一定是应用程序如何处理它们。让我们看看<代码>nvarchar存储为
UCS-2
。这是不可配置的。我的所有列都是nvarchar,排序规则是拉丁1如果您的列实际上是
nvarchar
,则这些列没有编码-它们是Unicode-句点。这些列是否可能在数据填充之前为
varchar
类型,然后在数据填充之后转换为
nvarchar
?这不是正确处理它的应用程序,这是能够正确检测字符编码的高级浏览器的优点,因此我希望在数据库中存储正确的字符,因为我想在另一个非基于web的应用程序中显示它们!我认为这不是问题所在。请注意,您的示例中有问号,而不是随机字符。他们一定是做错了什么。@Martin Smith是的,你是对的,我认为他有一些其他的排序规则,而不是默认或阿拉伯语,我认为按照我的建议做会解决这个问题。正如我在评论中解释的,数据类型已经是NVARCHAR,但字符是用西方编码存储的,所以我需要把这个字符转换成Unicode!
CREATE TABLE #TestTable
(
Column1 VARCHAR(100) COLLATE Latin1_General_100_CI_AI,  --<-- VARCHAR Column with Default Collation
Column2 VARCHAR(100) COLLATE Arabic_CI_AI_KS_WS,        --<-- VARCHAR Column with Arabic Collation
Column3 NVARCHAR(100),                                  --<-- NVARCHAR Column with Default Collation
Column4 NVARCHAR(100) COLLATE Arabic_CI_AI_KS_WS        --<-- NVARCHAR Column with Arabic Collation
)
INSERT INTO #TestTable 
VALUES(N'پیشرفت 50 درصدی مخزن ذخیره آب بوشهر'
       ,N'پیشرفت 50 درصدی مخزن ذخیره آب بوشهر'
       ,N'پیشرفت 50 درصدی مخزن ذخیره آب بوشهر'
       ,N'پیشرفت 50 درصدی مخزن ذخیره آب بوشهر')

SELECT * FROM #TestTable
Column1                               Column2                               Column3                             Column4
?????? 50 ????? ???? ????? ?? ?????   پيشرفت 50 درصدي مخزن ذخيره آب بوشهر   پیشرفت 50 درصدی مخزن ذخیره آب بوشهر پیشرفت 50 درصدی مخزن ذخیره آب بوشهر