sql-server - 将 utf-8 编码的 varbinary(max) 数据转换为 nvarchar(max) 字符串
问题描述
有没有一种简单的方法可以将 utf-8 编码的 varbinary(max) 列转换为 T-SQL 中的 varchar(max)。类似的东西CONVERT(varchar(max), [MyDataColumn])
。最好的解决方案是不需要自定义功能。目前,我在客户端转换数据,但这有一个缺点,即正确的过滤和排序不如服务器端有效。
解决方案
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
为无意义的字节链。
一个简单的CAST
orCONVERT
将不起作用:VARCHAR
将每个单个字节作为一个字符。这肯定不是你所期望的结果。NVARCHAR
将每个 2 个字节的块作为一个字符。再次不是你需要的东西。
您可能会尝试将其写入文件并使用BCP
(v2014 SP2 或更高版本)将其读回。但我为您看到的更好的机会是CLR 函数。
推荐阅读
- typescript - 从 Amazon Web Services SQS 轮询消息的最佳方式是什么
- python-3.x - 如何对文件中的特定类型的数据进行排序?
- javascript - 最大侦听器问题:打字稿项目和无服务器 webpack
- c - 结构中的线程本地存储
- android - 在 RecyclerView 的适配器中实现的 OnClickListener 不起作用
- python - TypeError: unhashable type: 'list' lemmatizer
- jquery - 由于不相关的错误,无法获取城市和地区数据
- swift - 如何使用 swift 语言在 Xcode 中添加返回按钮历史记录
- apache-spark - 如何根据多个条件过滤掉 RDD?
- node.js - 在节点中发布表单并将数据响应接收回同一网页