当我在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/

10-13 07:48
查看更多