为什么Mercurial认为我的SQL文件是二进制的?

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

我认为编码可能是一个问题,所以我试图重新生成脚本,并指定ANSI的文本文件输出,但我得到相同的行为。 我可以在记事本中看到他们,没有任何奇怪的angular色出现。 为什么Mercurial认为这些文件是二进制的?

否则,如果有人可以推荐一个很好的工具来编写SQL Server数据库,这可能不会导致这个问题,那也可以。

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

前两个字节可能是你的问题所在。 他们可能看起来像ÿþ。 或hexFF FE。

在保存对话框上的“保存”button是一个select列表。 select“使用编码保存…”并select“US-ASCII-Codepage20127”。 我相信这个设置是粘性的,将来会保存下来。

根据文档 ,它被认为是二进制iff文件中有空字节。 SQL文件不应该有空字节,所以我会先检查(尝试查找hex编辑器)。 我假设你知道你可以强迫diff来把它当成文本

安德鲁是对的; 这是一个NUL字节的地方(我的猜测是一个粗鲁的编辑器工具插入的开始时的字节顺序标记 )。 不要担心它,但不像SVN或CVS Mercurial不处理二进制文本和文本不同。 当你做'hg log'的时候,它们显示的是不同的,但是却没有完全不同的处理。

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

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

我知道这有点晚,但是我想出了一个脚本来将* .sql文件批量保存为UTF-8。

完整的答案发布在StackOverflow的另一个线程,所以我只是发布链接在这里 – https://stackoverflow.com/a/9743360/336079

我有类似的问题,并决定使用http://www.devio.at/index.php/smoscript中find的工具来帮助我解决问题。; 我通过将以下内容放置在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 

这个想法是删除旧的文件夹,以便从数据库中删除的任何对象将从源代码pipe理中删除。 这也保存文件为UTF8没有任何date/时间戳,所以他们在版本控制工作。