odbc - (也许)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= 中是否有某些字符需要转义?我尝试了所有不同的组合,但没有运气。
解决方案
正如微软的文档所述(强调)——
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
包含LCB
、RCB
或时使用EQ
。ValueFormat1
必须在Value
包含SC
或以 . 开头时使用LCB
。
ValueContent1
必须用 and 括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}}};"
推荐阅读
- python - Python中函数的输出
- visual-studio-code - Ctrl + 单击 VS Code 终端,在新窗口中显示打开的文件夹
- python - 如何访问 GridSearchCV 的 SGDClassifier 参数?
- h3 - 更好的五边形/六边形面积比
- python - python通过QuickFix连接到多个会话
- python - 无法在 ubuntu 18.04 中安装 python3-pip(python 版本 -> python3.7)
- python - 将变量的值从一个文件导入另一个文件而不在python中执行函数
- android - 来自普通函数的 Flutter 调用构建器函数
- c# - 如何在 c# 中使用 AES 128 位加密字符串?
- java - ApplicationContextProvider.getContext() 和 class.forName() 的区别?