【问题标题】:Default encoding in SQL Server Management StudioSQL Server Management Studio 中的默认编码
【发布时间】:2014-01-31 09:18:36
【问题描述】:

我最近在笔记本电脑上重新安装了 SSMS 2008

当我点击“New Query..”时,系统会提示我选择文件的编码,这是我以前从未被要求做的事情

我已经在选项的文本编辑器部分中将 sql 关联到“带编码的 SQL 查询编辑器”并重新启动 SSMS

我不想在每次执行新查询或打开现有 sql 文件时都选择编码,我可以做些什么来关联编码

【问题讨论】:

    标签: sql-server sql-server-2008 ssms


    【解决方案1】:

    根据 Fakher Halim 在 Microsoft Azure Feedback Forums 上发布的解决方法。

    我有同样的问题。 Git 不会显示历史上的任何差异 (除了“二进制文件 a/x.sql 和 b/x.sql 不同)。所以我点击了 工具=>选项=>环境=>国际设置。改变了 语言从“英语”到“与 Microsoft Windows 相同”。现在 git diff 运行良好——正常报告版本差异!

    【讨论】:

    • 这对我没有任何影响。
    • 值得指出的是,我使用的是英国英语 Windows,因此 SQL Server 中的“英语”是一种不同的语言。
    【解决方案2】:

    根据其他地方给出的建议 (https://feedback.azure.com/forums/908035-sql-server/suggestions/32892454-need-a-way-to-set-the-default-encoding-for-query-f),我已经破解了一个“命令脚本”以尝试使用 BOM 将“默认编码”“更改为 UTF-8”。该脚本通过将带有 BOM 模板的 UTF-8 写入 SQL Server 程序文件树中的 SQLFile.sql 文件来工作。它在我的机器上运行过一次,但这并不意味着它没有错误或 100% 安全。使用风险自负!

    根据该线程中“微软的”回复:

    文件的默认保存方式由位于 C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\sqlworkbenchprojectitems\Sql 的主模板文件 SQLFile.sql 的方式决定。如果您使用 ANSI 编码保存此文件,则后续的新查询会话将使用此编码。

    请注意,在我的机器上,我在不同的路径中找到了模板,因此我编写了脚本以在任一 Program Files 下找到与该名称匹配的 any 文件。这似乎是一个很愚蠢的名字,错误的碰撞应该很少见。

    如果没有传递任何参数(或任何与预期不同的参数),那么它应该进行试运行。确保首先在没有管理权限的情况下运行它。它至少会找到任何适用的文件,然后您可以决定是继续执行脚本还是自己修改文件。

    要真正运行脚本,然后传递“force”的第一个参数。这是危险的部分。注意谨慎。要在不暂停用户输入的情况下运行脚本完成,然后传递“dontpause”的第二个参数(这可以与空的第一个参数一起传递以在试运行期间跳过暂停)。

    我选择 UTF-8 是因为它与 7 位 ASCII 兼容,它支持您编写脚本时所关心的绝大多数语言和字符,它非常有效地存储西方文本和源代码,而且它是源代码控制/文本补丁友好。脚本底部的模板包含一个字节顺序标记 (BOM),以向编辑器表明它不是 ISO-8859-1 或其他不兼容的默认 8 位编码。确保复制/粘贴时不会丢失。将实际的批处理脚本另存为 ASCII(或兼容的;没有 BOM!)。命令处理器在 UTF-8 BOM 上阻塞。

    @echo off
    setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION || exit /b 1
    
    if "x%1" == "xforce" (
        echo Force enable. Danger Will Robinson! This means that I'm going to
        echo attempt to move files and write a new file to replace them. This
        echo is potentially destructive if there are any bugs in this script.
        echo In particular, if there are any unrelated files with the name
        echo sqlfile.sql under your Program Files directories then they'll be
        echo corrupted.
        echo.
        echo This script is going to require elevated privileges to write to
        echo Program Files. Execute the Command Prompt application as an
        echo administrator to proceed ^(should be harmless to try without
        echo elevation first^).
        echo.
        echo I RECOMMEND YOU _DO NOT_ RUN THIS SCRIPT FROM WINDOWS EXPLORER
        echo BECAUSE YOU MAY HAVE A HARDER TIME READING THE OUTPUT. Start a
        echo Command Prompt and run it there.
        echo.
    
        if not "x%2" == "xdontpause" (
            echo Now is a good time to Ctrl+C ^(and Y^).
            pause
        )
    ) else (
        echo Dry-run enabled. Pass a lone argument of "force" to go for real. 1>&2
        echo Be careful running the script several times. Your template backup
        echo will be overwritten and lost.
    )
    
    set paths="C:\Program Files (x86)\SQLFile.sql" "C:\Program Files\SQLFile.sql"
    
    for /f "tokens=*" %%f in ('dir /a /b /s %paths% 2^>NUL') do @(
        echo.
        echo Found: %%f
    
        if "x%1" == "xforce" (
            echo Moving to: %%f.orig
            echo.
            echo If you ^(or anything else^) has made any changes to your template
            echo then you should be able to recover your template from the backup
            echo file above ^(not yet, once you continue^) ^(alternatively,
            echo recover the template from the source file now^).
    
            if not "x%2" == "xdontpause" (
                pause
            )
    
            move "%%f" "%%f.orig" || exit /b 1
        )
    
        echo.
        echo Writing a standard UTF-8 template with byte-order mark ^(BOM^).
        echo Feel free to open this file up afterward and manually set the
        echo encoding preferred. You can also replace it with your own
        echo template text.
    
        if not "x%2" == "xdontpause" (
            pause
        )
    
        set ok=0
    
        rem Read in myself, look for the __BEGIN__ marker and write
        rem subsequent lines to the file.
        for /f "tokens=*" %%g in (%~dpf0) do @(
            if !ok! == 1 (
                if "x%1" == "xforce" (
                    if "x%%g" == "x." (
                        echo.
                        echo.>>"%%f"|| exit /b 1
                    ) else (
                        echo %%g
                        echo %%g>>"%%f"|| exit /b 1
                    )
                )
            ) else (
                if "%%g" == "__BEGIN__" (
                    echo.
                    echo Found marker. Starting write on next ^(non-empty^) line... 1>&2
                    echo.
                    set ok=1
                )
            )
        )
    )
    
    exit /b 0
    
    Below is the SQL template. Lines containing only a dot (.) represent
    blank lines. Actual blank lines will be lost.
    
    __BEGIN__
    BEGIN TRANSACTION;
    .
    SET XACT_ABORT ON;
    .
    .
    .
    ROLLBACK;
    --COMMIT;
    

    【讨论】:

      【解决方案3】:

      在 SQL Server Management Studio 中,选择工具/选项,然后展开“文本编辑器”并添加扩展名“sql”并将其映射到“SQL 查询编辑器”。

      如果您使用 ASCII 字符,则该解决方案有效。如果 sql 包含需要显式编码的字符(由 SQL 编辑器确定),那么您必须选择一种编码。当在 SQL 编辑器和其他编辑器 (NotePad++) 中创建文件,然后在其他编辑器中编辑这些文件时,问题就会出现。 NotePad++ 保存的文件没有标头,可以猜出编码。另一方面,一旦使用某些字符,SQL 编辑器总是需要编码头。

      【讨论】:

      • 什么,为什么?这有什么帮助?
      • OP 迈克回答了他自己的问题 - 这显示了迈克提到的选项在哪里可以找到。
      • 如果您使用 ASCII 字符,则该解决方案有效。如果 sql 包含需要显式编码的字符(由 SQL 编辑器确定),那么您必须选择一种编码。当在 SQL 编辑器和其他编辑器 (NotePad++) 中创建文件,然后在其他编辑器中编辑这些文件时,问题就会出现。 NotePad++ 保存的文件没有标头,可以猜出编码。另一方面,一旦使用某些字符,SQL 编辑器总是需要编码头。
      【解决方案4】:

      以前的答案建议使用工具→选项→环境→国际设置,但 SSMS 17.2 中不存在此选项。

      相反,您可以转到文件→另存为...,单击“保存”按钮上的箭头,然后选择“使用编码保存”。

      【讨论】:

      • 这不是您更改默认值的方式。
      【解决方案5】:

      我真是个白痴 - 我将关联更改为“SQL 查询编辑器”,现在一切正常

      “带编码”位真的应该让我知道!

      【讨论】:

      • 你能解释一下你的意思吗?您更改的设置在哪里?
      猜你喜欢
      • 2018-12-31
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2012-02-09
      • 2011-02-12
      • 2011-07-08
      相关资源
      最近更新 更多