【问题标题】:how to not use N in TSQL when insert XML UTF 16插入 XML UTF 16 时如何在 SQL 中不使用 N
【发布时间】:2020-06-22 17:33:24
【问题描述】:

我想知道在插入 UTF16 XML 时是否可以在 TSQL 中不使用 N 前缀? 因为我有一个新版本的数据库,我将 NTEXT 列的类型更改为 XML。 使用 NTEXT 格式,以前的所有软件都可以在不使用 N 前缀的情况下成功插入行。 但是现在使用 XML 列的类型,当我尝试使用 utf16 插入 XML 时,我得到了转换错误。 所以我通过在新软件版本中使用 N 前缀来解决这个问题。但我希望所有以前的软件继续成功插入。

有解决办法吗?也许通过更改列排序规则(从来没有这样做过)?

感谢您的帮助

嗨, 我在这里添加示例。 旧软件示例

INSERT INTO [myTable] ([id], [xmldata]) VALUES (1, '<?xml version="1.0" encoding="UTF-16"?><viewlist version="3">....</viewlist>')

新软件示例

    INSERT INTO [myTable] ([id], [xmldata]) VALUES (1, N'<?xml version="1.0" encoding="UTF-16"?><viewlist version="3">....</viewlist>')

【问题讨论】:

  • With NTEXT format, all previous software can insert row without using N Prefix successfully - 这意味着您实际上从未拥有可以从 Unicode 中受益的数据。是的,在将字符串文字插入ntextxml 列时,您绝对应该使用N
  • ntexttext 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)See details here
  • 我想到了一个触发器,可以将 unicode 添加到给定的字符串中,但我没有找到任何解决方案将字符串转换为 unicode 到触发器中:(
  • 如果一个字符串已经作为非 unicode 字符串提供,在查询中添加 N 绝对不会做任何事情。角色数据已被销毁。
  • 当列是 XML 类型时,问题出在新软件版本上。旧软件使用 utf16 prolog 插入 XML,不会导致 NTEXT 列出现问题

标签: sql-server xml tsql utf-16


【解决方案1】:

(1) 通常,根据您的字符集,您可以安全地删除 N'...' 前缀。 SQL Server 会隐式执行此操作,因为 XML 数据类型存储为 UTF-16。

(2) 如果您的 XML 确实包含 UNICODE 字符,则 T-SQL 级别的 N'...' 是强制性的。

SQL Server 去除所有 XML 序言声明。喜欢'&lt;?xml version="1.0" encoding="UTF-16"?&gt;。如果您将查询回插入的 XML,您将看到 prolog 已消失。

虽然您可能通过不同的方式插入 XML:中间层应用程序、SSIS、bcp 等。规则始终不同。

您应该编辑您的原始帖子并分享几个关于如何插入 XML 的真实示例。

【讨论】:

  • 请比较select cast('&lt;a&gt;☺&lt;/a&gt;' as xml)select cast(N'&lt;a&gt;☺&lt;/a&gt;' as xml)的结果。
  • @GSerg 笑脸是完美的选择。
  • @GSerg,我同意这个幽默。让我们等待 op 的 T-SQL 示例。
  • @YitzhakKhabinsky 其实幽默只是副产品。选择面部的主要原因是它不是来自任何国家代码页的字符。否则你可能会用两个代码 sn-ps 得到相同的结果,并认为它毕竟没问题。
  • @GSerg,您上面的 cmets 反映了操作场景:“...使用 NTEXT 格式,所有以前的软件都可以在不成功使用 N 前缀的情况下插入行 - 这意味着您实际上从未有过可以受益的数据从 Unicode..."
猜你喜欢
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2011-01-07
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
相关资源
最近更新 更多