如何生成与 Advantage Database Server 格式相同的 GUID 字符串?
Posted
技术标签:
【中文标题】如何生成与 Advantage Database Server 格式相同的 GUID 字符串?【英文标题】:How to generate a GUID string in the same format as Advantage Database Server? 【发布时间】:2015-02-14 07:58:12 【问题描述】:我有一个优势数据库 V11,我目前在其中存储了一个唯一标识符,它是一个使用 NewIDString('F') 生成的 22 个字符长的 GUID 字符串。
ADS 帮助中的 sn-p 如下:-
“F 或文件 – 使用文件和 URL 安全 base64 编码编码为 22 字节字符串的 GUID,格式为 xxxxxxxxxxxxxxxxxxxxxx。Base64 编码字符串区分大小写,不应存储在不区分大小写的字符串字段中。 "
是否可以在 Microsoft SQL 中生成相同格式的 GUID 字符串?
如果没有,ADS 帮助文件会列出其他格式如下:-
新字符串 返回格式化为字符串的 GUID。如果未指定格式参数,则将 GUID 字符串格式化为具有以下模式 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 的十六进制字符串。格式参数可以是以下值:
M 或 MIME – 使用 MIME base64 编码以 xxxxxxxxxxxxxxxxxxxxxxxx 格式编码为 24 字节字符串的 GUID。 Base64 编码字符串区分大小写,不应存储在不区分大小写的字符串字段中。
F 或 File – 使用文件和 URL 安全 base64 编码编码为 22 字节字符串的 GUID,格式为 xxxxxxxxxxxxxxxxxxxxxx。 Base64 编码字符串区分大小写,不应存储在不区分大小写的字符串字段中。
N 或数字 - 编码为 32 字节十六进制字符串值的 GUID,格式为 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。
D 或 Delimited – 编码为 32 字节十六进制字符串的 GUID,格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。
B 或括号 - 编码为 32 字节十六进制字符串的 GUID,格式为 [xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]
P 或括号 - 编码为 32 字节十六进制字符串的 GUID,格式为 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
C 或花括号 - 编码为 32 字节十六进制字符串的 GUID,格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
MS-SQL 可以生成其中之一吗?
问候
迈克
【问题讨论】:
【参考方案1】:在 SQL Server 中,NEWID 函数创建新的 GUID(SQL Server 数据类型称为UNIQUEIDENTIFIER)。 GUID 是一个二进制值,您在问题中提到的各种格式就是这样,只是二进制值的不同字符串表示形式。在 NEWID 示例 A 的 MSDN 页面中,将 GUID 的标准字符串表示形式显示为 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX。
【讨论】:
在 ADS 中恰好是UPPER(NEWIDSTRING(D))
N、B、P 和 C 都只是它的变体,您可以使用字符串操作获得这些变体。对于 M 和 F,请参阅我的答案。
谢谢你们。那是完美的。我只想在两个数据库中保持一致性和相同的大小。【参考方案2】:
在 SQL-Server 中创建 BASE64 编码字符串并不简单,but possible。
因此,从 ADS 以 File
格式创建 GUID 所需的一切都可以由 SQL-Server 生成。
新字符串(M):
-- Generate a GUID in the format "1Jg/YZ7tNkG7PQr1wVe7KA=="
SELECT
CAST(N'' AS XML).value(
'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
, 'VARCHAR(MAX)'
) AS "NEWIDSTRING_M"
FROM (
SELECT CAST(NEWID() AS VARBINARY) AS bin
) AS bin_sql_server_temp;
新字符串(F):
-- Generate a GUID in the format "1Jg/YZ7tNkG7PQr1wVe7KA"
SELECT
LEFT(CAST(N'' AS XML).value(
'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
, 'VARCHAR(MAX)'
), 22) AS "NEWIDSTRING_F"
FROM (
SELECT CAST(NEWID() AS VARBINARY) AS bin
) AS bin_sql_server_temp;
其中 F 只是 M 并删除了最后两个字符(始终为“==”)。
【讨论】:
谢谢。我想我会坚持使用您的第一个答案中的标准 36 个字符。以上是关于如何生成与 Advantage Database Server 格式相同的 GUID 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.net MVC3 中获取 Advantage Database 数据?
Advantage Database Server v11.1.30 .Net Data Provider 是不是与 Visual Studio 2019 兼容?
在 Delphi 中获取 Advantage Database 查询的进度
如何在 Delphi Code 中获取 Advantage Database Server 安装的许可证计数