我只是使用SQL Server Management Studio编写了我的SQL Server存储过程,表定义等,并尝试将它们添加到我的Mercurial源代码控制存储库中。它们添加得很好,但是现在当我改变并区分它们时,Mercurial将它们称为“二进制文件”,并没有给我一个合适的统一差异。
我认为编码可能有问题,所以我尝试重新生成脚本并为文本文件输出指定ANSI,但我得到了相同的行为。我可以在记事本中查看它们,没有任何奇怪的字符出现。为什么Mercurial认为这些文件是二进制文件?
否则,如果有人可以推荐一个好的工具来编写可能不会导致此问题的SQL Server数据库,那么这也可能有用。
答案 0 :(得分:38)
我遇到了这个问题,因为SQL Server Management Studio将文件保存为Unicode。 Unicode文本文件的前两个字节(大多数时间)定义编码。大多数较新的文本编辑器(例如记事本)都透明地处理它。
前两个字节可能就是您的问题所在。它们可能看起来像ÿþ。或FF FE in hex。
在“保存”对话框上的“保存”按钮上是一个选择列表。选择“使用编码保存...”并选择“US-ASCII-Codepage20127”。我相信这个设置是粘性的,并将保留以供将来保存。
答案 1 :(得分:4)
根据the docs,如果文件中有空字节,则认为它是二进制的。 SQL文件不应该有空字节,所以我先检查一下(尝试查看十六进制编辑器)。我假设你知道你可以强制差异将其视为文本
答案 2 :(得分:3)
即将发布的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
贷方转到https://joehanna.com/sql-server/changing-the-default-encoding-of-sql-files-in-ssms/