【发布时间】:2019-01-11 12:25:51
【问题描述】:
我有一列设置为 Varchar,数据库设置为 SQL_Latin1_General_CP1_CI_AS。
当用户在我们的网络前端输入他们的名字并保存数据时,它没有正确保存重音字符。
网络用户输入了以下内容,“Béala”,但它被保存在数据库中,如下所示,“Béala”。
我相信将列从 Varchar 更改为 NVarchar 应该可以防止这种情况继续发生(?),但是,我有两个问题。
1) 如何对列中的现有数据进行选择并正确显示?
select CONVERT(NVARCHAR(100),strAddress1) from [dbo].[tblCustomer]
这仍然无法正确显示数据。
2) 转换为 NVarchar 后如何更新列中的数据以正确保存重音字符?
非常感谢, 雷。
【问题讨论】:
-
@a_horse_with_no_name - 感谢您对标签的更改建议。
-
您的应用程序已保存 mojibake -- UTF-8 编码数据存储为 Windows-1252 编码字符串。在 SQL Server 2019 之前,引擎根本不支持 UTF-8,因此在纯 T-SQL 中修复这个问题基本上是不可能的。在 .NET 中,您可以使用
Encoding.UTF8.GetString(Encoding.GetEncoding("Windows-1252").GetBytes("Béala"))解决此问题。将存储类型更改为NVARCHAR可能 会使客户端应用程序正常工作,但实际上您可能会得到相同的、错误编码的结果(或不同的损坏)。您可能需要修复数据发送到数据库的方式。 -
好的,所以我对“不可能”的说法是错误的——只是very cumbersome,但有人已经完成了这项工作。不过,这只是为了修复存储不正确的数据——它不应用于解决客户端的问题,它需要自己修复。
标签: sql-server sql-server-2012