SQLCMD命令无法插入重音符号


19

我试图运行sqlcmd.exe以便从命令行设置新数据库。我正在Windows 7 64位上使用SQL SERVER Express 2012。

这是我使用的命令:

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log 

这是一部分sql文件创建脚本:

    CREATE DATABASE aqualogy 
    COLLATE Modern_Spanish_CI_AS
    WITH TRUSTWORTHY ON, DB_CHAINING ON;
    GO
    use aqualogy
    GO
    CREATE TABLE [dbo].[BaseLayers] (
    [Code] nchar(100) NOT NULL ,
    [Geometry] nvarchar(MAX) NOT NULL ,
    [IsActive] bit NOT NULL DEFAULT ((1)) 
    )

    EXEC sp_updateextendedproperty @name = N'MS_Description', @value = N'Capas de     cartografía base de la aplicaicón. Consideramos en Galia Móvil la cartografía(...)'
, @level0type = 'SCHEMA', @level0name = N'dbo'
, @level1type = 'TABLE', @level1name = N'BaseLayers'

好吧,请检查一下单词是否有重音;这是表格的说明。数据库创建没有问题。脚本可以理解“整理”,如您在所附的屏幕截图中所见。尽管如此,检查桌子时口音仍无法正确显示。整理问题

我真的很感谢您的帮助。非常感谢你。

[编辑]:大家好。使用Notepad ++更改SQL文件编码效果很好!非常感谢您的帮助:我从这个问题中学到了一些有趣的东西!

在此处输入图片说明


1
您的SQL脚本文件的编码是什么?
Pondlife

我会接受@Pondlife的想法。抓住一个文本编辑器(例如Notepad ++),在其中打开.sql文件,转到“编码”,然后查看您的文件不是ANSI(或其他不受支持的编码)格式。如果是这样,请选择将文件转换为其他内容。我会说UTF8应该这样做。让我们知道进展如何。
玛丽安

Answers:


8

从注释中可以看出,问题并不完全与表或SQLCMD导入特殊字符的方式有关。通常,有问题的导入与脚本本身的格式有关。

Management Studio本身提供了使用特定编码进行保存的选项,这将在将来解决该问题。首次保存文件(或使用“另存为”)时,应单击“ 保存”按钮附近的小箭头,以使用“ 使用编码保存 ”选项。

在此处输入图片说明

默认情况下,它将文件保存为西欧(1252)。每当我有任何特殊字符时,我都会使用UTF8(尽管也许可以使用其他一些限制性编码),因为它通常是最快的解决方案。

在此处输入图片说明

我(从图片中)不确定您使用的是SSMS,因此请确保您自己的编辑器可以选择以其他编码保存文件。如果没有,通常可以在智能编辑器中转换文件(就像您已经在Notepad ++中尝试过的那样)。但是,如果从宽编码转换为窄编码然后再转换为宽编码(例如:从Unicode转换为ANSI,再转换为Unicode),则可能不起作用。


嗨,玛丽安。再次感谢你。我使用了Navicat的“数据传输”功能,因为我喜欢它生成sql脚本的方式(快速,独立于mdf文件,并且从现在开始对我有用)。我在Navicat的“数据传输”功能中检查了一些参数,但没有找到任何更改输出文件编码的方法。我将不得不使用Notepad ++进行一些额外的工作来更改编码,但是这没什么大不了的。
Oskytar

好吧,没问题。尽管通常情况下,如果答案有用,或者使用马克作为答案(答案旁边的对号),通常会使用Upvote功能(答案旁边的向上箭头)在此网站上表示感谢,或者,如果答案完全解决了您的问题, ):-)。在FAQ中查看更多信息。
玛丽安

我更正我的最后一条评论:使用Navicat执行“数据传输”时,可以选择文件输出编码。
Oskytar

很酷,因此现在您将可以绕过手动转换步骤。那更好。
玛丽安

2
这个答案似乎是不正确的。我的文件由Notepad ++保存在UTF-8中。SQLCMD.exe无法正确传输字符。如果我将内容复制到SSMS,则可以正常工作。真正的解决方案是swasheck提供的添加参数-f 65001的答案。–
Tomas Kubes

39

另一种选择,其中一个我刚刚得知,来自sqlcmd文档。您需要将代码页设置为sqlcmd与文件编码相匹配。对于UTF-8,代码页为65001,因此您需要:

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001


1
这只是挽救了我的性命,我打算做一个powershell脚本来读取带有import-csv -encoding UTF8的CSV文件,以获取正确的信息。谢谢
Spörri

当我不得不将带有fadas(á,é,í,ó,ú)的爱尔兰文本值插入NVARCHAR列时,这对我很有用
2007年

这是正确的答案
Pitchmatt

2

这种事情非常棘手,因为在不告诉您的情况下做了很多事情。

我要做的第一件事是使用sqlcmd显示字符串。如果它在cmd.exe窗口中正确显示,这是一个有用的事实。接下来,我选择将convert字符串添加到varbinary 的行,以查看实际存在的字节。我认为cartografía将显示为0x636172746f67726166c3ad61,其中带重音的“ i”由字节c3ad表示,这是该字符的UTF-8编码。在现代西班牙语专栏(Windows 1252)中使用UTF-8不好。Windows 1252中该字符的字节值为十进制237(ED十六进制)。

如果该列包含错误编码的数据,则错误在于其插入方式。也许删除字符串常量中的前导N(N'string'告诉SQL Server生成Unicode字符串,但简单地'string'指示字符使用客户端的编码)会插入Modern Spanish而不是Unicode。

如果该列包含正确编码的数据,那么我会说您在GUI显示中发现了一个错误。

如果无法让sqlcmd正确插入数据(是否以N开头),那么您想向Microsoft投诉。完成后,使用convert(colname as varbinary)- 可以显示存储在该列中的字节,这对于解释出现的问题至关重要。


詹姆斯,您好,非常感谢您的详细回答。我做了一些测试,而Sqlcmd.exe 没有显示正确的字符串。显然如何插入数据是一个问题。
Oskytar

使用Sql Profiler,我调试了使用SQl Server GUI客户端时将哪些语句发送到SQL SERVER。插入[ElementType]([代码],[名称],[描述],[GeometryType],[stringId],[CapturedGeometryType])值('ESTACION','Estación','Estación','Multipoint',NULL, '点'); 很好,所以所有的口音都正确插入了!这我的sql脚本中出现的“插入语句” 相同。我应该在sql脚本文件中指定字符代码吗?
Oskytar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.