Geo*_*las 4 sql-server collation alter-table encoding unicode
我有一个表格,里面有一些希腊文本行,如nvarchar(2000)
.
最近,我将列的类型更改为 ,varchar(4000)
但我意识到一些希腊字符显示为问号。
所以,我试图改回以nvarchar(4000)
修复它,因为我认为字符的 unicode 仍然保持不变。
我只是想知道,有没有办法解决这个问题,而不是在更改表之前恢复我创建的备份?
不,没有办法“修复”数据,因为数据不再存在。转换为 时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。这是一个显示问题,许多没有以各种字体表示的字符将以相同的方式显示,而不会改变字符的实际值,但它们仍然是不同的字符。