pyodbc解包SQL_GUID以转换为小写字符串

2024-09-28 01:26:02 发布

您现在位置:Python中文网/ 问答频道 /正文

sql server和pyodbc以大写形式返回所有sql\U GUID数据类型,而查询不区分大小写:

psql.py --sql="select controllerid from controllers where controllerid='F573A57D-9247-44CB-936A-D16DD4E8327F'"
[('F573A57D-9247-44CB-936A-D16DD4E8327F', )]
psql.py --sql="select controllerid from controllers where controllerid='f573a57d-9247-44cb-936a-d16dd4e8327f'"
[('F573A57D-9247-44CB-936A-D16DD4E8327F', )]

我希望它以小写形式输出。 添加了一个pyodbc.add_output_转换器()方法,它只在SQL\U GUID上执行较低的操作,但这是一个压缩结构:

^{pr2}$

它看起来像一个字节,但是改变它:

^{3}$

我想我需要解包,但是格式如何呢。在

在pyodbc之外我可以做一个uuid.下()


Tags: frompysqlserverwhereselect形式guid
1条回答
网友
1楼 · 发布于 2024-09-28 01:26:02

当我们打印出服务器为GUID返回的原始字节时

'F573A57D-9247-44CB-936A-D16DD4E8327F'

我们得到了

^{pr2}$

将ASCII字符转换为十六进制值,删除\x前缀,并添加一些我们得到的空格

7da573f5 4792 cb44 936a d16dd4e8327f

这表明SQLServerODBC正在返回GUID的字节,但前三个段的顺序是little-endian顺序,而最后两个段是big-endian顺序。在

所以,如果我们把输出转换函数改为

def guid_to_lowercase(value):
    first_three_values = struct.unpack('<I2H', value[:8])
    fourth_value = struct.unpack('>H', value[8:10])[0]
    fifth_value = struct.unpack('>Q', b'\x00\x00' + value[10:16])[0]
    guid_string_parts = (
        '{:08x}'.format(first_three_values[0]),
        '{:04x}'.format(first_three_values[1]),
        '{:04x}'.format(first_three_values[2]),
        '{:04x}'.format(fourth_value),
        '{:012x}'.format(fifth_value),
    )
    return '-'.join(guid_string_parts)

它回来了

'f573a57d-9247-44cb-936a-d16dd4e8327f'

相关问题 更多 >

    热门问题