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

问题描述 投票:47回答:7

我刚刚使用SQL Server Management Studio编写了我的SQL Server存储过程,表定义等脚本,并试图将它们添加到我的Mercurial源代码控制存储库中。他们添加的很好,但是现在当我更改和比较它们时,Mercurial称它们为“二进制文件”,并且没有给我适当的统一差异。

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

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

sql-server mercurial
7个回答
38
投票

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

前两个字节可能是您的问题所在。它们看起来像like。或FF FE(十六进制)。

在“保存”对话框的“保存”按钮上是一个选择列表。选择“使用编码保存...”,然后选择“ US-ASCII-Codepage20127”。我认为此设置具有粘性,将保留以备将来保存。


4
投票

根据the docs,如果文件中有空字节,则视为二进制。 SQL文件不应具有空字节,因此我将首先进行检查(尝试在十六进制编辑器中查找)。我认为您确实知道可以强制diff将其视为文本]


3
投票

安德鲁是对的;它是某个地方的NUL字节(我猜粗鲁的编辑器工具一开始会插入Byte Order Mark)。不过,不必担心,与SVN或CVS不同,Mercurial根本不会以不同的方式处理二进制和文本。当您执行“ hg日志”时,它显示它们有所不同,但是它们的处理方式完全不同。

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


1
投票

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


0
投票

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

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


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,没有任何日期/时间戳,因此它们在版本控制中效果很好。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.