【发布时间】:2018-07-27 22:31:05
【问题描述】:
我正在开发一个具有VARBINARY(255) 列的数据库,这对我来说没有意义。根据值的长度,该值可以是数字或单词。
对于存储的任何数字,它都是一个 4 字节的十六进制字符串 0x00000000,但从左到右读取,而字节从右到左读取。所以对于像255 这样的数字,它是0xFF000000,对于像745 这样的数字,它是0xE9020000。这是我不明白的部分,为什么它以这种方式存储而不是0x02E9,0x2E9或0x000002E9?
说到单词,每个字符都存储为一个 4 字节的十六进制字符串,就像上面一样。像空格这样的东西存储为0x20000000,但像Sensor 这样的单词是0x53000000650000006E000000730000006F00000072000000 而不仅仅是0x53656E736F72。
谁能向我解释为什么以这种方式存储数据?是否所有内容都表示为 4 字节字符串,因为存储的数字可以是完整的 4 字节,而文本用零填充以保持一致性?为什么将零填充到值的右侧?为什么第 4 个字节在前,第 1 个字节在后存储?
如果从 SQL 的角度来看这些都没有意义,我想可能是从我无权访问源的客户端应用程序以这种方式提供数据的。会这样吗?
最后,我想创建一个包含此列的报告,但已转换为正确的数字或单词。有没有比使用子字符串、修剪和递归更简单、性能更高的方法?
【问题讨论】:
-
这不是 sql server 问题。存储的值是应用程序提供的值,它们的解释嵌入在应用程序逻辑中。您可能需要一些时间来阅读有关字节序(小与大)和字符串(ascii 与 unicode)的信息。由于数据类型是二进制的,可能所有值都是用于在应用程序中访问此信息的结构的直接内存映像 - 这可能是您看到额外字节的原因。但唯一知道的方法是查看应用逻辑。
-
@SMor 关于小端与大端的好点,这是一个很大的帮助!从那以后,我处理了从 LSB 到 MSB 的值,去掉了填充的零(在存储单词而不是数字的情况下),现在将单词作为我的最终结果!谢谢指点!
标签: sql-server hex