2010-03-02 101 views
46

我刚刚使用SQL Server Management Studio编写了SQL Server存储过程,表定义等,并试图将它们添加到我的Mercurial源代码管理存储库中。他们被添加得很好,但现在当我改变和区分它们时,Mercurial称它们为“二进制文件”,并没有给我一个适当的统一差异。为什么Mercurial认为我的SQL文件是二进制文件?

我认为编码可能是一个问题,所以我试图重新生成脚本并指定ANSI文本文件输出,但我得到了相同的行为。我可以在记事本中查看它们,没有任何奇怪的角色出现。为什么Mercurial认为这些文件是二进制的?否则,如果有人可以推荐一个用于脚本化SQL Server数据库的好工具,这可能不会导致此问题,那也可以。

回答

37

我遇到了这个问题,因为SQL Server Management Studio将文件保存为Unicode。 Unicode文本文件的前两个字节(大部分时间)定义了编码。大多数较新的文本编辑器(例如记事本)可以透明地处理这个问题。

前两个字节可能是您的问题所在。他们可能看起来像ÿþ。或十六进制FF FE。

在保存对话框上的“保存”按钮是一个选择列表。选择“使用编码保存...”并选择“US-ASCII-Codepage20127”。我相信这个设置很粘,并且会保留以备将来保存。

+5

要明确,这不是Unicode的问题。它是UTF-16,它嵌入了空值。 UTF-8不会,除非你实际使用U + 0000(一个SQL文件通常不会)。 – 2010-03-02 22:04:22

+7

很高兴知道为什么hg认为它是二元的,但最好找到一个修复mercurial来迫使它改变主意。重新保存所有脚本是非常糟糕的解决方法。问题在于mercurial,而不是在文件中。 – Stan 2012-01-24 09:41:24

+1

答案对我很有帮助,但我使用了“Unicode(UTF-8无签名) - Codepage 65001”而不是ASCII – 2012-04-05 14:56:55

4

根据the docs,它被认为是二进制iff文件中有空字节。 SQL文件不应该有空字节,所以我会先检查(尝试查看十六进制编辑器)。我假设你知道你可以强迫差异对待它作为文本

3

安德鲁是正确的;这是一个NUL字节的地方(我的猜测是一个Byte Order Mark在开始插入一个粗鲁的编辑器工具)。不要担心它,尽管与SVN或CVS不同,Mercurial根本不处理二进制文本和文本。它显示他们不同,当你做'hg日志',但他们不处理完全不同。

即将发布的mercurial发布特殊情况下的BOM,并且不要让它们触发“用户可能不希望在控制台上看到这种差异”的行为。

+0

我们实际上得出的结论是,我们无法以一种可以在Windows下工作的一致方式处理UTF-16或UTF-32。请参阅:http://mercurial.markmail.org/thread/lsoj7dj47mx6xoyx补丁格式不能处理非ASCII字符: - /建议欢迎(请在邮件列表中)。 – 2010-03-03 23:44:29

1

我在Linux上使用SQL Server编辑存储过程文件并使用git时遇到了这个问题。 Git认为这是一个二进制文件,因为来自SQL Server的文件是UTF-16,因此包含NUL。我对此的修复是emacs,它允许您将编码更改为UTF-8。

0

我有类似的问题,并决定使用在http://www.devio.at/index.php/smoscript发现的工具来帮助我解决问题。我通过将以下内容放入cmd文件中来脚本化SMOscript。

rd /s /q [the scripts folder] 
"C:\Program Files\devio IT Services\SMOscript\smoscript.exe" -s [server] -d [database] -F [the scripts folder] -U 

这个想法是删除旧的文件夹,以便任何从数据库中删除的对象将从源代码管理中删除。这也将文件保存为UTF8,没有任何日期/时间戳,所以它们在版本控制方面效果很好。

相关问题