SQL Server 将查询输出为 UTF8 而不是 UTF16

标签 sql sql-server json utf-8 utf-16

我一直在尝试使用 SQL 查询中的一些数据向 JSON Web 服务提供数据。我遇到的问题是数据以 UTF16 形式存储在 SQL Server 数据库中,我必须将其以 UTF8 形式提供给 Web 服务。

我想在 SQL 查询运行时使用 SQL 查询来转换数据。我一直在阅读各种论坛,并得到的印象是没有特别简单的方法来进行转换。

例如,我有 ÖSTLUND 等名称,据我所知,它是有效的 Unicode/Windows 代码页 1253。

我认为 UFT8 更像 Windows 代码页 1252 是否正确?

我尝试过各种版本的 Cast 和 Collat​​e,但正在努力寻找哪种方式可以给我最好的答案。

    (cast(SURNAME as varchar(100)) COLLATE SQL_Latin1_General_Pref_CP1_CI_AS) 

    (cast(SURNANE as varchar(100)) COLLATE Latin1_General_100_CI_AS_KS_WS_SC)

有人对如何最好地做到这一点有任何建议吗? Cast and Collat​​e 是执行此操作的方法吗?

更新:

该应用程序是用 Uniface 编写的旧应用程序。应用程序服务器正在运行 SQL 脚本以响应数据库字段更改。然后,它使用 SQL 输出填充 Web 服务帖子的有效负载。 SQL 的输出符合 Web 服务的 JSON。

最佳答案

首先,Unicode 能够表示所有字符而不需要代码页。 UTF-8、UTF-16 和 UTF-32 都是 Unicode,并且都代表所有 Unicode 字符(当然,当前已映射)。

关于这个特定问题,SQL Server 就像 Windows 和 .NET 一样,在 Unicode 数据方面实际上只适用于 UTF-16(Little Endian)。如果您想要 UTF-8 格式的字符串,那么在从 SQL Server 返回结果集中的数据后,您可以将它们编码为 UTF-8,因为您将其打包为 JSON 格式。所以听起来这必须在“Uniface”中完成。

此外,关于问题中的两个 CAST 语句,它们实际上做了同样的事情,因为两者都使用 Latin1 locale/LCID,它映射到 VARCHAR 的代码页 1252数据。

关于SQL Server 将查询输出为 UTF8 而不是 UTF16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36498229/

相关文章:

json - 将 JSON 字符串作为输入传递给 aws 命令

javascript - 如何在输入文本中设置唯一可能的值

sql - 在没有数据时也提取日期值

sql - 什么决定了 Liquibase 变更集的执行顺序

php - 如何防止 PHP 中的 SQL 注入(inject)?

PHP odbc_fetch_row 非常慢

sql - 如何有条件地返回一个字段或另一个字段?

sql-server - 加入具有多行的 2 个表

sql - 存储过程在 CONCAT 语句中包含参数后立即使用 CONCAT 函数截断变量

javascript - 从 MYSQL 获取 JSON 格式的结果并使用它