SQL Server Management Studio中的默认编码

13

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

当我点击“新建查询...”时,现在会提示我选择文件的编码方式,这是以前从未被要求做过的事情。

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

我该怎么做才能关联到编码方式呢?我不想每次新建查询或打开现有的sql文件都需要重新选择。

5个回答

8
根据Fakher Halim在Microsoft Azure反馈论坛上发布的解决方法。

我遇到了同样的问题。Git不会显示历史记录中的任何差异(除了“二进制文件a/x.sql和b/x.sql不同”)。因此,我单击了“工具=>选项=>环境=>国际设置”。将语言从“英语”更改为“与Microsoft Windows相同”。现在GIT DIFF运行得非常完美--正常报告版本差异!


6
对我来说,这没有任何影响。 - Liam
值得指出的是,我使用的是英国英语Windows操作系统,因此在SQL Server中,“English”是一种不同的语言。 - meh-uk
@meh-uk 这个链接已经失效了。 - undefined
我不确定我能做什么 - 希望上面的文字对您有所帮助! - undefined

4

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

根据那个线程中“Microsoft”的回复:

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

请注意,我的计算机上找到的模板路径不同,因此我编写了脚本来查找任何一个在“Program Files”下与其匹配的文件名。看起来这是一个非常愚蠢的名字,假冒的情况应该很少发生。
如果没有传递参数(或者传递了除预期参数之外的任何参数),则应该执行干运行。请确保先以非管理员权限运行它。它至少会找到任何适用的文件,然后您可以决定是否要继续使用该脚本或自己修改文件。
要实际运行脚本,请将第一个参数设置为“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编辑器始终需要编码头。

什么,为什么?这有什么帮助吗? - Liam
OP Mike回答了自己的问题 - 这显示了Mike提到的选项在哪里可以找到。 - LeeLep
如果您使用ASCII字符,此解决方案有效。 如果SQL包含需要显式编码的字符(由SQL编辑器确定),则必须选择一种编码方式。 当在SQL编辑器和其他编辑器(NotePad ++)中创建文件,并在其他编辑器中编辑这些文件时,问题就出现了。 NotePad ++保存文件时没有标题,可以猜测编码。 另一方面,一旦使用某些字符,SQL编辑器始终需要编码标头。 - LeeLep

3

之前的答案建议使用“工具”→“选项”→“环境”→“国际设置”,但是在SSMS 17.2中没有这个选项。

相反,您可以前往“文件”→“另存为...”,点击“保存”按钮上的箭头,并选择“编码方式另存为”。


8
这不是更改“默认设置”的方法。 - Olson.dev

-1

我真是个白痴 - 我把关联改成了“SQL查询编辑器”,现在一切都正常了

“带编码”这一点真的应该让我想到!


7
请问您能否解释一下您的意思?您改变的设置在哪里? - CowboyBebop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接