如何生成与 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 安装的许可证计数

Advantage Database 8.1 SQL IN 子句

JDBC Advantage Database 找不到表(驱动程序冲突?)