我正在使用C#自动为用户表插入命令,并且有一个用户的名字带有重音E,我相信有一个坟墓?
Desirée
每当它进入SQL Server表时,它显示为:
Desir?e
我应该在此列上使用哪种数据类型,以确保它保留重音e?
我尝试过varchar和nvarchar,似乎都不重要。
插入代码:
var lines = File.ReadAllLines(users_feed_file);
我认为存在编码问题。当Visual Studio读取我的文件时,它将名称读为Desir?e
。
到目前为止,我尝试使用以下方法重载File方法:
Encoding enc = new UTF8Encoding(true, true);
var lines = File.ReadAllLines(users_feed_file,enc);
但这没有效果。
var lines = File.ReadAllLines(users_feed_file, Encoding.UTF8);
也不起作用。
答案 0 :(得分:0)
Sql Server将unicode文本存储为Unicode-2或UTF-16。也就是说,它对所有字符使用固定的两个字节。 UTF-8对所有字符使用可变的三字节,根据需要使用一个,两个或三个字节。如果问题中的字符(最好发布实际的unicode值)由UTF-8翻译成三个字节,那么Sql Server会将其读回两个双字节字符,其中一个可能不是有效的,可显示的字符,从而呈现问号。请注意,Sql Server不存储问号,这就是您使用的文本编辑器呈现这个乱码的方式。
尝试将您的C#编码更改为Encoding.Unicode
,看看是否有助于对相关字符进行往返。
同样的推理适用于应该适合一个字节的字符,但是用UTF-8表示两个字符。因此,例如,具有严重性的小e的unicode十六进制值为xE8
,其中可以以两个字节表示为00 E8
。但UTF-8将其呈现为C3 E8
。现在,用Unicode(UTF-16)查找该值 - 没有这样的字符。所以在这种情况下,不是两个字节表示为三个,而是一个字节错误地表示为两个。在尝试调试扩展字符问题时,This resource非常有用。
请注意,对于基本的Latin ascii集,UTF-8使用与Unicode相同的值,因此这些字符往返就好了。使用扩展字符集时,无法保证两种编码的兼容性。
答案 1 :(得分:0)
您可以尝试使用此代码:
var lines = File.ReadAllLines(users_feed_file, Encoding.Unicode);
但是在记事本中你可以查看文件编码,检查一下。