云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

天翼云_如何进入服务器_折扣

小七 141 0

云服务器网_关于_物联网软件开发

大家好。这是我的第一篇博文,所以请客气。

在这篇博文中,我将给出一个c语言的代码示例,说明如何使用sql从hana读取诊断文件,并将记录它的缺点。在解释如何正确读取数据的基础上,我将解释内部的工作原理。

这是一个相当技术性的问题,我花了时间为自己写了这个代码注释,然后在这篇博文中进行了翻译。复杂的代码需要注释!!!

特性/用例

SAP Hana将其部分诊断数据记录为linux文件系统中普通文件的一部分。像indexserver\u alert这样的文件_hxehost.trc公司是这些诊断跟踪的示例。

这些文件可以通过ssh下载,但也可以从hana驾驶舱(数据库资源管理器)或hana studio下载或查看。

sap hana数据库还提供了一种仅使用sql读取跟踪文件的方法,大大简化了这些文件的检索。这些文件的内容可以从公共视图M\u TRACEFILE\u CONTENTS访问。这是驾驶舱和工作室查看和下载文件的方式。

我使用此视图检索sql跟踪文件的内容,作为我的sql profiler for sap hana的一部分,怎么选购云服务器,名为Winterly sql profiler。sql跟踪文件包含系统生成的消息,例如打开了连接、执行了命令,但它也包含用户生成的内容(sql命令)。这些sql命令可以是任何语言,并且可以包含特殊的unicode字符。想想汉字、阿拉伯语、法语重音字符等。我的软件需要读取文本并对其进行流式处理;当添加新数据时,它只从您留下的位置检索新数据。解析文本并以可读的方式呈现给用户。它读取sql跟踪文件并实时显示sql命令。

发出

而乍一看,从M\u TRACEFILE\u内容检索数据很简单。但是,如果你做得不好,你最终会得到除了7位ascii的基本拉丁字符以外的任何内容的损坏文本帮助.sap. 我认为文档是缺乏的,物联网的应用有哪些,我在这件事上浪费了很多时间,所以我想分享我的知识,帮助下一个需要使用这个视图的开发人员。

主要的问题是,创建视图是为了返回二进制数据,而不是文本。这一点很明显,数据的分割方式,每1000字节,以及列偏移量,控制您在文件位置的位置/在文件中查找。

因为这样做是为了处理二进制文件,并且它像nvarchar一样返回此数据,所以sap hana在将结果返回给使用者之前对二进制数据进行置乱。这种置乱会导致任何非标准ascii的文件出现问题。

不幸的是,跟踪文件夹中的大多数诊断文件都与ascii字节兼容,直到它们与ascii字节不兼容,并且您开始出现错误……

解释

您必须从此视图从不返回文本这一事实开始。它只返回和处理二进制数据。

为了能够从NVARCHAR等公开数据的视图返回二进制数据,数据库将二进制数据转换为字符。

数据库返回的数据始终是二进制的,但编码为拉丁-1以将其检索为字符。然后,这些字符在作为nvarchar字段的一部分提供给发送者之前被编码为utf-8。

在二进制文件的情况下,很容易理解返回的字符是不相关的字符。从视图中阅读mp3歌曲,您将看到文本。很明显,你的mp3歌曲不是文本。

但是在utf-8编码的文本文件中,utf-8和拉丁语-1之间有相似之处,使得基本格式兼容。这是一种误导,因为任何特殊字符和扩展字符都不兼容。碰巧的是,对于7位拉丁ascii字符(abc..),它们的数值在utf-8和ascii上是相同的,通过直接从查询中获取结果,文件看起来是可读的。

以我们试图获取的二进制文件为例,它是一个utf-8文本文件。它的内容是没有空格的"è1a"。例如,假设文件开头没有unicode BOM。它的基础二进制数据将是0xc3 0xa8 0x31 0x41。

数据被转换为拉丁-1编码的文本文件。每个二进制字节0xc3 0xa8 0x31 0x41在拉丁语-1/ISO/CEI 8859-1中表示为不相关字符¨1A。请注意,1和A字符看起来很好,但特殊字符é已损坏。

这些不相关的拉丁字符-1转换为utf-8,因为它们从数据库中显示为nvarchar(1000),所有nvarchar都以unicode显示。因此,它们的字符保持不变,但它们的底层数据发生了变化:0xc3 0x82 0xc2 0xa8 0x31 0x41。注意,由于utf-8是可变长度的,所以数据增加了。这些数据以utf-8字符"1a"的形式发送到sql客户机。将底层数据解析为二进制是不够的,因为由于长度可变,这些数据已经被破坏了。

我们必须做相反的操作才能取回原始的二进制数据。首先,获取unicode字符并将其转换为拉丁-1。内容¨1A将保持不变,但我们将返回数据0xc3 0xa8 0x31 0x41然后用这个数据,将它解析/解释为utf-8,因为我们知道这个二进制数据是utf-8。你得到你的原始数据è1a.

Unicode问题要知道