【问题标题】:Why does Mercurial think my SQL files are binary?为什么 Mercurial 认为我的 SQL 文件是二进制文件?
【发布时间】:2011-01-22 21:57:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server mercurial


    【解决方案1】:

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

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

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

    【讨论】:

    • 明确地说,问题不在于 Unicode。它是 UTF-16,其中嵌入了空值。 UTF-8 不会,除非您实际使用 U+0000(SQL 文件通常不会)。
    • 很高兴知道为什么 hg 认为它是二进制的,但最好为 mercurial 找到一个修复程序以迫使它改变主意。重新保存所有脚本是一种丑陋的解决方法。问题出在 mercurial 中,而不是在文件中。
    • 答案对我有用,但我使用了“Unicode(无签名的 UTF-8)-代码页 65001”而不是 ASCII
    • 这不是一个粘性设置,至少在 SSMS 2012 中不是。然而,这是一个巨大的痛苦。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我们实际上得出的结论是,我们无法以在 Windows 下工作的一致方式处理 UTF-16 或 UTF-32。请参阅:mercurial.markmail.org/thread/lsoj7dj47mx6xoyx 补丁格式无法处理非 ASCII 字符:-/ 欢迎提出建议(请在邮件列表中)。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我遇到了类似的问题,并决定使用在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,没有任何日期/时间戳,因此它们在版本控制中非常有用。

          【讨论】:

            【解决方案7】:

            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/

            【讨论】:

              猜你喜欢
              • 2015-03-24
              • 1970-01-01
              • 2012-01-25
              • 2020-09-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-14
              相关资源
              最近更新 更多