首页 > 解决方案 > (也许)ODBC SQL Server 连接字符串中的非法字符 PWD=

问题描述

根据我的研究,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= 中是否有某些字符需要转义?我尝试了所有不同的组合,但没有运气。

标签: odbcconnection-stringsql-server-express

解决方案


正如微软的文档所述(强调)——

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

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

empty-string ::=

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

attribute-value ::= character-string

attribute-keyword ::= identifier

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

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

添加

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

 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 ";"

...

ValueFormat1建议在需要Value包含LCBRCB或时使用EQValueFormat1必须在Value包含SC或以 . 开头时使用LCB

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

ValueContent1必须包含在ValueFormat1. 如果 中有一个RCBValueContent1它必须使用两个字符的序列ESCAPEDRCB来表示一个字符的值RCB

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

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

推荐阅读