根据我的研究,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 =中是否有某些字符需要转义?我没有运气就尝试了所有不同的组合。
答案 0 :(得分: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
可以选择将属性值括在大括号中,这样做是一种好习惯。当属性值包含非字母数字字符时,这可以避免出现问题。 假定值中的第一个右大括号终止了该值,因此值不能包含右大括号字符。
我建议您在设置密码时简单地删除括号,然后上面提供的连接字符串应该可以正常工作。
我在Microsoft的网站上进行了进一步的挖掘,发现一些可能与之相关的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 ";"
...
如果需要ValueFormat1
包含Value
,LCB
或RCB
,建议使用
EQ
。ValueFormat1
包含Value
或以SC
开头时,必须使用LCB
。
ValueContent1
必须用LCB
和RCB
括起来。封闭LCB
之前和RCB
后面的空格必须忽略。
ValueContent1
必须包含在ValueFormat1
中。如果RCB
中有一个ValueContent1
,则它必须使用两个字符的序列ESCAPEDRCB
来表示一个字符的值RCB
。
所有这些都归结为...我相信以下连接字符串应该为您工作(请注意,PWD值上有2个左/右大括号和3个右/右大括号) -
"Driver={SQL Server};Server=.\\MyInstance;Database=Master;UID=SA;PWD={{85C86BD7-B15F-4C51-ADDA-3B6A50D89386}}};"