(也许)ODBC SQL Server 连接字符串中的非法字符 PWD=

Posted

技术标签:

【中文标题】(也许)ODBC SQL Server 连接字符串中的非法字符 PWD=【英文标题】:(Maybe) Illegal character in ODBC SQL Server Connection String PWD= 【发布时间】:2019-03-13 20:04:46 【问题描述】:

根据我的研究,SQL Server 连接字符串的 PWD= 字段中没有非法字符。

但是,我使用 SQL Server Express 2008 将 SA 密码更改为 GUID,具体来说:

85C86BD7-B15F-4C51-ADDA-3B6A50D89386

所以当通过 ODBC 连接时,我使用这个连接字符串:

"Driver=SQL Server;Server=.\\MyInstance;Database=Master;UID=SA;PWD=85C86BD7-B15F-4C51-ADDA-3B6A50D89386;"

但它会在 SA 登录失败时返回。

但是,如果我将 SA 密码更改为一样长但没有 - 的密码,它就会成功! PWD= 中是否有某些字符需要转义?我尝试了所有不同的组合,但没有成功。

【问题讨论】:

【参考方案1】:

正如Microsoft's documentation 所说(强调)--

ODBC 使用的连接字符串具有以下语法:

connection-string ::= empty-string[;] | attribute[;] | attribute; connection-string

empty-string ::=

attribute ::= attribute-keyword=[]attribute-value[]

attribute-value ::= character-string

attribute-keyword ::= identifier

属性值可以选择用大括号括起来,这样做是个好习惯。这避免了属性值包含非字母数字字符时的问题。 假定值中的第一个右大括号终止该值,因此值不能包含右大括号字符。

我建议您在设置密码时简单地删除大括号,然后您上面提供的连接字符串应该可以正常工作。

添加

我在微软的网站上进一步挖掘,发现了一些可能相关的ABNF rules --

 SC           = %x3B         ; Semicolon 
 LCB          = %x7B         ; Left curly brackets 
 RCB          = %x7D         ; Right curly brackets  
 EQ           = %x3D         ; Equal sign 
 ESCAPEDRCB   = 2RCB         ; Double right curly brackets 
 SpaceStr     = *(SP)        ; Any number (including 0) spaces
 ODBCConnectionString =  *(KeyValuePair SC) KeyValuePair [SC]
 KeyValuePair = (Key EQ Value / SpaceStr)
 Key = SpaceStr KeyName
 KeyName = (nonSP-SC-EQ *nonEQ)
 Value = (SpaceStr ValueFormat1 SpaceStr) / (ValueContent2)
 ValueFormat1 = LCB ValueContent1 RCB
 ValueContent1 = *(nonRCB / ESCAPEDRCB)
 ValueContent2 = SpaceStr / SpaceStr (nonSP-LCB-SC) *nonSC
 nonRCB = %x01-7C / %x7E- FFFF                                 ; not ""
 nonSP-LCB-SC = %x01-1F / %x21-3A / %x3C-7A / %x7C- FFFF       ; not space, "" or ";"
 nonSP-SC-EQ = %x01-1F / %x21-3A / %x3C / %x3E- FFFF           ; not space, ";" or "="
 nonEQ = %x01-3C / %x3E- FFFF                                  ; not "="
 nonSC = %x01-003A / %x3C- FFFF                                ; not ";"

...

Value 需要包含LCBRCBEQ 时,建议使用ValueFormat1。当Value 包含SC 或以LCB 开头时,必须使用ValueFormat1

ValueContent1 必须用LCBRCB 括起来。必须忽略封闭 LCB 之前和封闭 RCB 之后的空格。

ValueContent1 必须包含在 ValueFormat1 中。如果ValueContent1中有RCB,则必须使用二字符序列ESCAPEDRCB来表示一字符值RCB

所有这些都归结为... 我相信以下连接字符串 应该 适合您(请注意,PWD 值上有 2 个左/开大括号和 3 个右/右大括号) --

"Driver=SQL Server;Server=.\\MyInstance;Database=Master;UID=SA;PWD=85C86BD7-B15F-4C51-ADDA-3B6A50D89386;"

【讨论】:

感谢您的回复。不幸的是,SA 密码的选择不是我的。所以您是说在连接字符串中 PWD= 不能包含 brackets?因为在 Management Studio 中设置 SA 密码是完全合法的。 我应该将此主题命名为“如何在 ODBC 连接字符串中转义左大括号”。经过更多的测试和研究,事实证明正确的支架没有问题。但是我还没有找到摆脱左括号的方法。可能没有。 我已经编辑了我的答案。 SQL Server 密码123应该在 ODBC 连接字符串中可作为PWD=123 传递。 (不平衡的大括号是故意的。)【参考方案2】:

根据this page,名称中唯一合法的“特殊字符”(我认为他们在谈论 DSN)是 UNDERSCORE:

ODBC 规范(和 SQL 规范)规定, 必须采用“字母[数字|字母|_]...”的格式。唯一的 允许的特殊字符是下划线。

没有提及“ODBC 规范”。 This page 说它是 ODBC 4.0 规范。

【讨论】:

以上是关于(也许)ODBC SQL Server 连接字符串中的非法字符 PWD=的主要内容,如果未能解决你的问题,请参考以下文章

通过 ODBC 连接连接到 Sql Server CE

R SQL Server ODBC连接在服务器名称中转义字符

SQL Server数据库连接字符串的组成

记录 ODBC、SQL Server

MS SQL SERVER、PHP、PDO、ODBC:用户登录失败

SQL Server ODBC 连接失败