使用MSDeploy发布DACPAC文件时,后置部署脚本中的UTF8字符丢失。

8
我有一个DACPAC文件,是在Visual Studio 2013中为一个SSDT项目构建的。该SSDT项目定义了一个发布后脚本,旨在将一些静态数据合并到已发布的表中,其中一段数据包含版权符号。
现在,当我通过Visual Studio发布数据库时,版权符号被保留,并正确地合并到目标表中。但是,当我使用MSDeploy发布相同的数据库(使用相同的dacpac和发布配置文件)时,版权符号则会作为“?”符号合并到目标数据库中。同样,当我使用Action:Script而不是Action:Publish时,生成的SQL脚本包含一个“?”而不是版权符号。
看起来,Visual Studio生成的脚本是UTF8编码的,但内置到dacpac中的脚本却失去了UTF8编码。有没有人有任何想法如何解决这个问题?

1
你是否检查了脚本文件本身的编码?如果SQL脚本文件是ANSII格式,请将其保存为UTF8格式。 - Vadim Loboda
是的,我检查过了。在 Visual Studio 中,发布后脚本文件确实是以 UTF-8 编码的。同样,如果我双击 .dacpac 文件,解压缩的 postdeploy.sql 文件也是 UTF-8 编码的。我还比较了由 Visual Studio 生成的发布脚本文件和从 .dacpac 文件中解压缩出来的文件。唯一的区别(值得提到的是在发布后部分)就是丢失了特殊字符。 - Michael J. Heier
你是否找到了解决办法?我们的解决方法是忽略有问题的程序,因为以下的变通方法会违反持续部署。对于我们来说,忽略很容易,因为我们有一个可自定义的部署修饰器,允许我排除任何针对该对象的步骤。 - rshadman
这个话题有任何更新吗?使用相同的流程几个月后,我也遇到了同样的情况。 - Playing With BI
我解决了我的问题,在我的情况下创建了一个视图,并从Excel中复制并粘贴了名称,这为“-”符号添加了另一个字符。 错误的是 [Operations DB – Plant Master],正确的是 [Operations DB - Plant Master] - Playing With BI
3个回答

3
我也遇到过这个问题。在记事本中打开这个文件,然后在同一文件夹中“另存为”UTF-8编码以替换旧文件。然后再次发布即可解决问题。请参考以下截图:Notepad Screenshot

0

终于我得到了答案。在插入语句中,我需要在 Unicode 字符串之前加上字符N

INSERT INTO [Library] ([DisplayNameCN])
    VALUES (N'鴨脷洲公共圖書館')

0

你是否在字符串文字前缀加上N来表示它包含Unicode字符串?你的列是否定义为ncharnvarchar?创建dacpac的过程可能会根据数据声明为非Unicode字符串的区别执行转换。版权字符无法在此转换中存留,这并不奇怪。

有关Unicode与字符字符串的详细信息,请参见https://msdn.microsoft.com/zh-cn/library/ms179899.aspx


是的,我已经在字符串值前加了N''前缀,并将所有相关类型声明为NVARCHAR(len),而不是VARCHAR(len)。奇怪的是,如果我通过SSDT项目上下文菜单运行发布操作,Visual Studio似乎可以正常工作。只有当我通过SqlPackage或MSBuild部署DACPAC时,字符编码才会出现错误。 - Michael J. Heier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接