首页 > 解决方案 > 将 utf-8 编码的 varbinary(max) 数据转换为 nvarchar(max) 字符串

问题描述

有没有一种简单的方法可以将 utf-8 编码的 varbinary(max) 列转换为 T-SQL 中的 varchar(max)。类似的东西CONVERT(varchar(max), [MyDataColumn])。最好的解决方案是不需要自定义功能。目前,我在客户端转换数据,但这有一个缺点,即正确的过滤和排序不如服务器端有效。

标签: sql-servertsql

解决方案


SQL-Server 不知道 UTF-8(至少您可以高效使用的所有版本)。从v2014 SP2 开始的支持有限(以及有关受支持版本的一些详细信息)utf-8从磁盘读取编码文件时BCP(与将内容写入磁盘相同)。

重要的是要知道:

VARCHAR(x)不是。_ utf-8它是1 字节编码的扩展 ASCII,使用代码页(存在于排序规则中)作为字符映射。

NVARCHAR(x)不是(utf-16非常接近它,它是ucs-2。这是一个2 字节编码的字符串,几乎涵盖所有已知字符(但存在例外)。

utf-8将对纯拉丁字符使用 1 个字节,但对编码的外来字符集使用 2 个甚至更多字节。

AVARBINARY(x)将 保存utf-8为无意义的字节链。

一个简单的CASTorCONVERT将不起作用:VARCHAR将每个单个字节作为一个字符。这肯定不是你所期望的结果。NVARCHAR将每个 2 个字节的块作为一个字符。再次不是你需要的东西。

您可能会尝试将其写入文件并使用BCP(v2014 SP2 或更高版本)将其读回。但我为您看到的更好的机会是CLR 函数


推荐阅读