当我在DB中插入一个字符串,该字符串包含来自FileInfo.GetFiles()项目的“à”或“é”的特殊字符时,我会遇到问题并且SQL保存分裂的特殊字符。非特殊字符就可以了。
例如,“à”变为“a”,“é”变为“e”。有没有人遇到过这种麻烦?
这是代码
DirectoryInfo di = new DirectoryInfo(path);
foreach (FileInfo fi in di.GetFiles())
{
Logger.LogInfo("Info: " + fi.Name);
}
基本上,如果string是“sàrl”,则保存日志“Info:sa`rl”
当我通过VS断点时,我看到带有“à”的字符串,但是当我记录它时,char被分割。
我的SQL排序规则是拉丁语CI AS(SQL_Latin1_General_CP1_CI_AS),DB已经使用特殊字符串主持字符串而没有问题。
谢谢大家
修改
我将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!
所以它不是来自DB,它是关于字符串(编码?)
的问题答案 0 :(得分:2)
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。您无法直观地区分它们,但是当您查看实际编码的字节时它们肯定会显示出来。