当我在DB中插入一个包含特殊字符的字符串时,该字符串包含来自FileInfo.GetFiles()项的“à”或“é”,我遇到了问题,SQL保存了拆分的特殊字符。非特殊字符也可以。
例如,“à”变成“ a`”,而“é”变成“ e´”。有人遇到这种麻烦吗?
这是代码
DirectoryInfo di = new DirectoryInfo(path);
foreach (FileInfo fi in di.GetFiles())
{
Logger.LogInfo("Info: " + fi.Name);
}
基本上,如果字符串为“sàrl”,则保存日志“ Info:sa`rl”
当我通过VS断点时,我看到带有“à”的字符串,但是当我记录它时,char被拆分了。
我的SQL排序规则是Latin CI AS(SQL_Latin1_General_CP1_CI_AS),数据库已经托管了带有特殊字符的字符串,没有问题。
谢谢大家
编辑
我也将fi.Name插入决赛桌时遇到了麻烦:
public bool InsertFile(string fileName, Societe company, string remark, PersonnelAM creator)
{
string commandText = (@"INSERT INTO [dbo].[TB_DOCSOCIETE_COM] " +
"([IdtSOC] " +
",[NomDOC] " +
",[RemDOC] " +
",[DateDOC] " +
",[IdtPER]) " +
"VALUES " +
"(@company" +
",@fileName" +
",@remark" +
",@date" +
",@creator) SELECT @@IDENTITY");
var identity = CreateCommand(commandText,
new SqlParameter("@fileName", DAOHelper.HandleNullValueAndMinDateTime<string>(fileName)),
new SqlParameter("@company", DAOHelper.HandleNullValueAndMinDateTime<int>(company.Id)),
new SqlParameter("@remark", DAOHelper.HandleNullValueAndMinDateTime<string>(remark)),
new SqlParameter("@date", DAOHelper.HandleNullValueAndMinDateTime<DateTime>(DateTime.Now)),
new SqlParameter("@creator", DAOHelper.HandleNullValueAndMinDateTime<int>(creator.id))
).ExecuteScalar();
return int.Parse(identity.ToString()) > 0;
}
我正在使用NLog,因此消息列的数据为varchar(8000),而记录消息的代码为
public static bool LogInfo(Exception ex, string message = "")
{
try
{
GetLogger().Log(LogLevel.Info, ex, message);
}
#pragma warning disable 0168
catch (Exception exception)
#pragma warning restore 0168
{
return false;
}
return true;
}
编辑2:
要清楚了解DB,以下3行:
Logger.LogInfo("BL1 " + "sàrl is right saved");
Logger.LogInfo("BL2 " + fi.Name + " is not right saved");
Logger.LogInfo("BL3 " + "sàrl" + " - " + fi.Name + " is not right too!");
给我的结果在数据库中:
BL1 sàrl is right saved
BL2 ENTERPRISE Sa`rl - file.pdf is not right saved
BL3 sàrl - ENTERPRISE Sa`rl - file.pdf is not right too!
因此它不是来自数据库,而是关于字符串的一个问题(编码?)
最佳答案
varchar(8000)
将列设置为NVARCHAR
。这不是整理问题。排序规则确定排序顺序和比较规则,而不是存储。确实,对于非unicode列(varchar
),排序规则用作提示以确定结果的代码页。但是代码页只能带您到此为止,因为显然1字节编码的代码页无法匹配文件系统命名的整个空间,文件系统命名是基于Unicode的2字节编码。
使用Unicode列:NVARCHAR
。
如果您想了解自己的经历,请运行以下命令:
declare @a nvarchar(4000) = NCHAR(0x00E0) + N'a' + NCHAR(0x0300)
select @a, cast(@a as varchar);
Unicode充满了许多奇妙的惊喜,例如Combining characters。您无法从视觉上区分它们,但是当您查看实际的编码字节时,它们肯定会显示出来。
关于c# - FileInfo.GetFiles()和特殊字符(重音符号),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49735561/