【问题标题】:Selecting data from table with UUID as binary()从表中选择 UUID 为 binary() 的数据
【发布时间】:2020-10-30 18:33:41
【问题描述】:

我有一个 AWS RDS Aurora MySQL 连接。以下是我操作创建、插入和获取数据的步骤:

创建表

CREATE TABLE user (
    user_id BINARY(16) PRIMARY KEY NOT NULL,
    first_name VARCHAR(25) NOT NULL, 
    last_name VARCHAR(25) NOT NULL,
);

插入表格

INSERT INTO user VALUES (
    UNHEX(REPLACE("9a9cbfga-7426-471a-af27-31be7tb53ii2", "-","")),
    "Jon",
    "Smith"
);

从表中获取

SELECT * FROM user WHERE user_id = UNHEX(REPLACE("9a9cbfga-7426-471a-af27-31be7tb53ii2", "-",""));

触发我的函数获取数据的处理函数如下:

module.exports.fetchUser = async (event, context, callback) => {

  const params = {
    resourceArn: 'arn:aws:rds:*********:cluster:************',
    secretArn: 'arn:aws:secretsmanager:*************',
    sql: 'SELECT * FROM user WHERE user_id = UNHEX(REPLACE("9a9cbfga-7426-471a-af27-31be7tb53ii2", "-",""))',
    database: 'dev_db1',
    continueAfterTimeout: true,
    includeResultMetadata: true
  }

  try {
    const db_res = await rdsDataService.executeStatement(params).promise();

    const response = {
      body: {
        message: 'Data fetched',
        data: JSON.stringify(db_res, null, 2)
      }
    };
    callback(null, response);
  } catch (error) {
    callback(null, error)
  }
};

为相同的结果执行 http 数据 API 端点:

{
    "body": {
        "message": "Data fetched",
        "data": [
            [
                {
                    "blobValue": {
                        "type": "Buffer",
                        "data": [
                            202,
                            136,
                            22,
                            206,
                            45,
                            214,
                            75,
                            233,
                            156,
                            28,
                            163,
                            223,
                            186,
                            115,
                            89,
                            107
                        ]
                    }
                },
                {
                    "stringValue": "Jon"
                },
                {
                    "stringValue": "Smith"
                },
            ]
        ]
    }
}

我只需要在表user 中获取所有用户的完整详细信息(为了方便起见,现在我只插入了一条记录)并显示确切的user_id 而不是blobValue。不确定如何在响应中将此 UUID 二进制文件转换为可红色的形式,如 9a9cbfga7426471aaf2731be7tb53ii29a9cbfga-7426-471a-af27-31be7tb53ii2。 我对在 MYSQL 和 Aurora 中处理查询有点陌生,任何帮助我完成这件事的人都会非常感激。提前致谢。

【问题讨论】:

  • 为什么在需要返回时首先将其保存为二进制文件并且您仍然查询 uuid
  • @nbk 实际上我被要求跟进这种格式。我们将使用 uuid 作为主键。所以,我试图使用它但无法弄清楚。即使我只是像 SELECT * FROM user 这样查询,它仍然会以 blob 格式给出相同的响应。
  • 将其保存为字符串,或者如果您需要二进制文件来制作另一列。
  • @nbk 你能帮忙写一些小的书面例子吗?
  • 不,我不能你的代码不起作用dbfiddle.uk/…

标签: mysql node.js amazon-aurora


【解决方案1】:

Mysql 8 有一个函数https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_bin-to-uuidhttps://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid-to-bin

但你必须手动完成。

因为我无法将您的数据插入到选择会做的任何地方

CREATE TABLE user (
    user_id BINARY(16) PRIMARY KEY NOT NULL,
    first_name VARCHAR(25) NOT NULL, 
    last_name VARCHAR(25) NOT NULL
)
INSERT INTO user VALUES (UNHEX(REPLACE("3f06af63-a93c-11e4-9797-00505690773f", "-","")),
    "Jon",
    "Smith");
SELECT * from user where user_id = UNHEX(REPLACE("3f06af63-a93c-11e4-9797-00505690773f","-","")) 
用户 ID |名字 |姓 :-------- | :--------- | :-------- |乔恩 |史密斯
SELECT CONCAT(SUBSTRING(HEX(user_id),1,8),'-',
             SUBSTRING(HEX(user_id),9,4),'-',
            SUBSTRING(HEX(user_id),13,4),'-',
            SUBSTRING(HEX(user_id),17,12)) user_id,first_name,last_name FROM user
用户 ID |名字 |姓 :-------------------------------- | :--------- | :-------- 3F06AF63-A93C-11E4-979700505690 |乔恩 |史密斯

db小提琴here

但是由于您仍然需要文本,请保留原始文本,这样您就不需要再次取消十六进制数据

CREATE TABLE user (
    user_id BINARY(16) PRIMARY KEY NOT NULL,
    first_name VARCHAR(25) NOT NULL, 
    last_name VARCHAR(25) NOT NULL,
    userid_txt Varchar(3&)
);

【讨论】:

  • 我无法理解 keep the original 这个东西,这到底是什么意思?
  • 每次你做你的选择,你必须计算 where 子句和结果,花费时间和 cpu 功率,如果你同时有 100 或 1000 或 50000 个用户,这会让你付出高昂的代价。所以创建一个 userid_txt 的索引,你保存 3f06af63-a93c-11e4-9797-00505690773f 并使用它来搜索并作为 SELECT 的返回值
  • 那么,这样做将有助于从 AWS 处理函数返回正确的数据格式,而不需要 blob?
  • 很难解释,使用uuid而不是整数,这样更快,因为你有,即使你没有稳定的连接或dffernet,你也必须保持唯一的标识符必须合并的本地数据库。所以你首先要获取所有具有一定能力的uuid。对于 rxample 哪些用户是教师,因此您的第一个选择已经为您提供了所有 uuids ,因此无需从您的二进制状态中恢复它。当我试图挣扎为什么你需要纯文本形式的 uuid 时,当你需要纯文本形式时,我认为不需要首先将 t 转换为二进制
  • 简而言之,您的意思是说我可以直接以实际形式传递/存储uuid,而无需以十六进制形式插入它而不替换'-',然后通过UNHEXING它来选择它.对吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2018-09-08
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2014-08-06
相关资源
最近更新 更多