SQL-Server Varchar 的大小
Posted
技术标签:
【中文标题】SQL-Server Varchar 的大小【英文标题】:Size of SQL-Server Varchar 【发布时间】:2019-05-08 08:08:24 【问题描述】:这是我获取用于通过 ODBC 访问的 SQL-Server 表的 varchar 字段大小的函数:
Function fn_field_size(par_tab, par_field As Variant) As Variant
Dim db_tab As DAO.Database
Dim tab_tab As DAO.TableDef
Dim tab_field As DAO.field
fn_field_size = 0
Set db_tab = CurrentDb()
Set tab_tab = db_tab.TableDefs(par_tab)
Set tab_field = tab_tab.Fields(par_field)
fn_field_size = tab_field.Size
Set tab_tab = Nothing
Set db_tab = Nothing
End Function
在我将该函数用于 varchar(1000) 字段之前,它似乎工作正常。在这种情况下,tab_field.Size 为 0。对于 Varchar(100) 等较小的字段,该函数可以正常工作并返回 100。
这是为什么?
【问题讨论】:
DAO 是必需的吗?我会尝试看看 ADO 是否更有意义。也就是说,根据documentation,您从DAO.Field.Size
获得的值是最大 大小,以字节为单位。由于 Access Text
字段最多只能包含 255 个字符(510 个字节?),我怀疑 DAO 可能将 varchar(1000)
视为一些 Memo
字段,其中 Field.Size
始终为 0。你会得到什么对于varchar(510)
与varchar(512)
?
@MathieuGuindon 是正确的,Access 数据库引擎会将 255 个字符或更少的字符解释为 Text
(或在较新版本中为 Short Text
)以及更多为 Memo
(或在较新版本中为 Long Text
) )。数据访问库 (DAO/ADO) 对此没有发言权,因为 Access 数据库引擎将如何使用其数据类型系统解释链接表。
我不确定是否需要 DAO。 DAO 和 ADO 有什么区别?我可以只在这个函数中使用 ADO 吗?
相当肯定跳过链接表/访问内容并打开带有连接字符串的Recordset
直接到 SQL Server,将为您提供正确的元数据。
Access 没有VARCHAR(1000)
字段的概念。所有文本字段均为 UTF-16,所有接受超过 255 个字符的字段都被解释为 Long Text。您需要在服务器上查找字段大小,并且可以使用 ADOX 来完成。我可以写一个答案,但通常你希望有可重用的逻辑来设置 ADODB 连接。您还可以使用直通查询从 SQL Server 查询信息。
【参考方案1】:
正如其他人所指出的,ODBC 将超过 255 个字符的 varchar、nvchar、char 视为“备忘录”类型列,因此您无法获得最大字符数。
假设您在 Access 中定义了传递查询。 (我总是制作一个,并在所有代码中一遍又一遍地重复使用它),然后您可以使用此代码获取任何字段的长度:
Public Function GetFLength(strTable As String, strField As String) As Long
Dim strSQL As String
strSQL = "select col_LENGTH('" & strTable & "','" & strField & "')"
With CurrentDb.QueryDefs("qryPassR")
.SQL = strSQL
GetFLength = .OpenRecordset()(0)
End With
End Function
对于 varchar(max),上面将返回 -1,但对于其他任何内容,它将返回列的长度。
【讨论】:
以上是关于SQL-Server Varchar 的大小的主要内容,如果未能解决你的问题,请参考以下文章
在SQL语句中怎样对varchar型别的列进行数值大小的比较
SQL-server'WEEKDAY'不是公认的内置函数名称[关闭]
Oracle 中 varchar2 PL/SQL 子程序参数的大小限制是多少?