我一直在尝试使用 SQL 查询中的一些数据向 JSON Web 服务提供数据。我遇到的问题是数据以 UTF16 形式存储在 SQL Server 数据库中,我必须将其以 UTF8 形式提供给 Web 服务。
我想在 SQL 查询运行时使用 SQL 查询来转换数据。我一直在阅读各种论坛,并得到的印象是没有特别简单的方法来进行转换。
例如,我有 ÖSTLUND 等名称,据我所知,它是有效的 Unicode/Windows 代码页 1253。
我认为 UFT8 更像 Windows 代码页 1252 是否正确?
我尝试过各种版本的 Cast 和 Collate,但正在努力寻找哪种方式可以给我最好的答案。
(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 Collate 是执行此操作的方法吗?
更新:
该应用程序是用 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/