我在 Sql Server 中有一个数据库,其集合 Arabic_CI_AS ,我需要将一些字符串数据与另一个 Postgres 数据库进行比较 Utf8 字符集。我还使用C#进行转换和放大相比。当字符串只包含一个单词时很容易完成(在这些情况下我应该将'ي'替换为'ی'),但是对于长字符串特殊的'(' charachter有问题。
我无法做到!我尝试了一些建议的解决方案,例如:
var enc = Encoding.GetEncoding(1256);
byte[] encBytes = enc.GetBytes(customer.name);
customer.name = Encoding.UTF8.GetString(encBytes, 0, encBytes.Length);
或:
SELECT cast (name as nvarchar) as NewName
from Customer
但他们不工作!任何人都可以帮助我吗?
输入和输出示例,请参见右侧的工具提示:
答案 0 :(得分:0)
也许这可以帮助您动态更改归类
SELECT name collate SQL_Latin1_General_CP1_CI_AS
from Customer
或
SELECT name collate Persian_100_CI_AI
from Customer
或 你可以在c#side
中试试这个string _Value=string.Empty;
byte[] enBuff= Encoding.GetEncoding("windows-1256").GetBytes(customer.name);
customer.name= Encoding.GetEncoding("windows-1252").GetString(enBuff);
您也可以选择其他排序规则。 您应该更改许多归类和编码号码以获得想要的结果。
答案 1 :(得分:0)
SQL Server不支持utf-8
个字符串。如果您必须处理 plain-latin 以外的字符,强烈建议您使用NVARCHAR
代替VARCHAR
进行阿拉伯语排序。
许多人认为NVARCHAR
为utf-16
而VARCHAR
为utf-8
。这不是真的!第二个是扩展ASCII 并且在任何情况下都使用1个字节,而utf-8
将编码一些具有多个字节的字符。
所以 - 最重要的问题是:为什么?
SQL Server可以将您的字符串转换为NVARCHAR
变量,将其转换为字节链并将其重新转换为前一个字符串:
DECLARE @str NVARCHAR(MAX)=N'(نماینده اراک)';
SELECT @str
,CAST(@str AS VARBINARY(MAX))
,CAST(CAST(@str AS VARBINARY(MAX)) AS NVARCHAR(MAX));
)
的问题是 - 很可能! - 当)
从左到右时,您的阿拉伯语字母从右向左。我想将上面查询的结果粘贴到此答案中,但无法将结果)
设置为原始位置...您尝试编辑,删除,替换,但是您得到了其他内容...不知何故有趣,但不是编码错误的问题,而是一个有缺陷的编辑......
无论如何,SQL-Server不是你的问题。您必须从SQL-Server读取字符串NVARCHAR
。 C#使用unicode字符串而不是整理的1字节字符串。每次转换都有机会破坏你的文字。
如果您的目标(或您向我们展示的工具提示)无法正确显示字符串,那可能完全可以,但编辑器不是......
如果将这样的UTF-8字符串传递回SQL-Server,你就会搞得一团糟......
UTF-8有意义的唯一地方是写入文件或通过小频段传输。如果一个文本包含很多普通的拉丁字符和一些奇怪的字母(比如常见的XML,HTML),你可以节省相当多的磁盘空间或带。使用远东文本,你甚至会夸大你的文字。其中一些字符需要3个甚至4个字节进行编码。
在您的数据库和应用程序中,您应该坚持使用unicode。