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

时间:2010-03-02 20:26:29

标签: sql-server mercurial

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

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

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

7 个答案:

答案 0 :(得分:38)

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

前两个字节可能就是您的问题所在。它们可能看起来像ÿþ。或FF FE in hex。

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

答案 1 :(得分:4)

根据the docs,如果文件中有空字节,则认为它是二进制的。 SQL文件不应该有空字节,所以我先检查一下(尝试查看十六进制编辑器)。我假设你知道你可以强制差异将其视为文本

答案 2 :(得分:3)

安德鲁是对的;它在某个地方是一个NUL字节(我的猜测是一个粗略的编辑器工具插入的开头Byte Order Mark)。不过不用担心,不像SVN或CVS,Mercurial根本不会处理二进制文本与文本。当你执行“hg log”时,它显示它们不同,但它们的处理方式完全不同。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

完整答案发布在StackOverflow上的另一个帖子中,所以我只是在这里发布链接 - https://stackoverflow.com/a/9743360/336079

答案 5 :(得分: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而没有任何日期/时间戳,因此它们在版本控制方面非常有用。

答案 6 :(得分:0)

SQL Server Management Studio的另一种方法是将默认的SQL模板文件更改为UTF-8(或所需的任何编码),这将影响以后通过SSMS进行的所有保存。

  • 在记事本中打开(以管理员身份):C:\Program Files (x86)\<ssms-version>\Common7\IDE\SqlWorkbenchProjectItems\Sql\SQLFile.sql
  • 文件>另存为
  • 将“编码”更改为UTF-8或类似格式
  • 覆盖原始文件

贷方转到https://joehanna.com/sql-server/changing-the-default-encoding-of-sql-files-in-ssms/