Nvarchar 到 varchar 到 nvarchar 字符的转换

Geo*_*las 4 sql-server collation alter-table encoding unicode

我有一个表格,里面有一些希腊文本行,如nvarchar(2000).

最近,我将列的类型更改为 ,varchar(4000)但我意识到一些希腊字符显示为问号。

所以,我试图改回以nvarchar(4000)修复它,因为我认为字符的 unicode 仍然保持不变。

我只是想知道,有没有办法解决这个问题,而不是在更改表之前恢复我创建的备份?

Sol*_*zky 8

不,没有办法“修复”数据,因为数据不再存在。转换为 时VARCHAR,每个字符的基础值都更改为 的 ASCII 值?。这不是显示问题,这些字符现在实际上是一个普通的问号。不幸的是,您需要从备份进行恢复。

下面的示例代码显示,一旦一个 Unicode 字符被转换为VARCHAR(假设由排序规则表示的代码页不支持该字符),它就会变成一个常规的 'ol 问号,并且永远保持这样:

DECLARE @Character NCHAR(1) = NCHAR(0x3525);
SELECT @Character AS [TheCharacter],
       UNICODE(@Character) AS [DecimalCodePoint],
       ASCII(@Character) AS [DecimalValueOfVarchar],
       UNICODE(CONVERT(VARCHAR(5), @Character)) AS [ConvertToVarchar], 
       UNICODE(CONVERT(NVARCHAR(5), CONVERT(VARCHAR(5), @Character)))
             AS [ConvertToVarcharAndBack], 
       ASCII('?') AS [VarcharQuestionMark],
       UNICODE(N'?') AS [UnicodeQuestionMark];

-- ?    13605   63  63  63  63  63
Run Code Online (Sandbox Code Playgroud)

下面的例子展示了一个 Unicode 字符的实例,它在大多数字体中被支持的可能性很大(至少目前是这样),因此它显示为一个方框,但是UNICODE内置的 n 函数表明底层代码仍然是正确的 Unicode 代码点:

SELECT NCHAR(0xABBF), N'?', UNICODE(N'?');

-- ?    ?   43967
Run Code Online (Sandbox Code Playgroud)

实际字符可以在这里看到:切诺基小写字母 YA U+ABBF是一个显示问题,许多没有以各种字体表示的字符将以相同的方式显示,而不会改变字符的实际值,但它们仍然是不同的字符。