从文本转移到 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 值
SQL 2008 - varchar(max)与文本数据类型[重复]