从文本转移到 varchar(MAX):MS Access 有啥问题吗?

Posted

技术标签:

【中文标题】从文本转移到 varchar(MAX):MS Access 有啥问题吗?【英文标题】:Moving from text to varchar(MAX): Are there any troubles to expect with MS Access?从文本转移到 varchar(MAX):MS Access 有什么问题吗? 【发布时间】:2011-12-20 04:51:31 【问题描述】:

众所周知,使用 SQL Server 后端的 MS Access 应用程序 (MDB) 在处理某些数据类型时会遇到问题。例如,

bit 字段支持已损坏:NULL values lead to strange errors, 十进制字段支持已损坏:Sorting does not work correctly, 等

我们现在正在考虑从 text/ntext 字段转移到 varchar(MAX)/nvarchar(MAX) 字段,as recommended by Microsoft:

ntext、text 和 image 数据类型将在 Microsoft SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

我们这样做会遇到麻烦吗?

【问题讨论】:

【参考方案1】:

我知道这是一篇较旧的帖子,但我认为它仍然与某些人相关。我经常处理遗留数据,这些数据从 Access 备注字段扩展到 SQL,然后在 Access 中转换为链接表。

我发现缩放到 NVARCHAR(max) 确实会导致链接表出现问题。根据您使用哪个驱动程序构建 Access Link 表,问题会有所不同。

使用 SQL Native Client 10,我的第一个发现是 Access 将字段视为 NVARCHAR(4000)。虽然使用 SQL Server 作为驱动程序确实改变了问题,但仍然存在问题。有了这个老司机,问题似乎更难追查,但确实出现了。通常有类似的尺寸问题。

当心,看起来运行正常的东西,实际上可能只是运行正常,因为还没有遇到正确的环境。

如果您发现您的字段数据从不需要超过 4000 个字符,则将其设为 NVARCHAR(4000)。如果你只需要 4000,设置为 MAX 就过分了。

【讨论】:

【参考方案2】:

我们处于相同的情况:MS-Access 前端,SQL Server 后端。我们已经将所有新字段创建为 nvarchar(max) 而不是 ntext,在用户端没有任何问题。由于我们不使用文本或图像字段类型,因此我不能对它们说任何话。

【讨论】:

【参考方案3】:

在工作中,我们也有相同的设置(Access 2003 前端,SQL Server 2005 后端),我们完全按照您的要求进行:

我们的 SQL Server 表包含 text/ntext 列,我们将它们更改为 varchar(max)/nvarchar(max)。 我们根本没有遇到任何问题,如果我没记错的话,我们甚至不必重新链接 Access 中的表......它就可以工作了。

【讨论】:

【参考方案4】:

我们最近确实发现了一个陷阱。问题是不能向链接表的 varbinary 字段写入超过 8000 个字节,即使该字段定义为 varbinary(MAX)。

证明:varbinary(MAX) on linked tables

【讨论】:

【参考方案5】:

这是 JStevens 对 answer 的附录。

较新的 SQL Server ODBC 驱动程序将 VARCHAR(MAX) 限制为 8000 个字符。尝试通过链接的 ODBC 表输入更多文本会导致此 ODBC 错误:

[Microsoft][ODBC Driver 17 for SQL Server]字符串数据,右截断(#0)

它适用于古老的 SQL Server 驱动程序,或数据类型 TEXT。 令人惊讶的是,它也适用于NVARCHAR(MAX)

这些发现适用于 Access 2010 或 2016 以及 SQL Server 2008 R2。

+--------------------+--------------+---------------------------------+
| Data type \ Driver | SQL Server | ODBC Driver 17 for SQL Server |
+--------------------+--------------+---------------------------------+
| VARCHAR(MAX)       | ok           | ODBC Error                      |
| NVARCHAR(MAX)      | didn't try   | ok                              |
| TEXT               | ok           | ok                              |
+--------------------+--------------+---------------------------------+

因此,如果您需要插入更多数据,则必须选择毒药。

SQL Server 对我来说不是一个选项,例如因为它不支持DATE 数据类型。

所以我坚持使用TEXT,并希望“ntext、text 和 image 数据类型将在 SQL Server 的未来版本中被删除”。只是一个empty threat。

Necro 编辑:NVARCHAR(MAX) 似乎没有新的 ODBC 驱动程序的 8000(或 4000)字符限制。

【讨论】:

以上是关于从文本转移到 varchar(MAX):MS Access 有啥问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 SSIS 将 SQL Server varchar(max) 传输到 MySQL 文本

我想为在 MS Azure Synapse 中存储为 varchar(max) 的匹配标记提取 XML 值

noi.ac #289. 电梯(单调队列)

SQL 2008 - varchar(max)与文本数据类型[重复]

RODBC sqlQuery() 在应该返回 varchar(MAX) 时返回 varchar(255)

Varchar(255) 到 Varchar(MAX)