mysql - 为什么 MySQL 在查询结果末尾添加不必要的填充?

标签 mysql sql node.js

我正在从 MySQL 数据库查询数据,但填充被附加到数据末尾,超出了字段的总长度。

它使用 mysql/xdevapi package 在 Node.js 中运行并查询MySQL Server 8.0.16社区。所选列定义为 accessKey CHAR(6)。 通过 MySQL Workbench 查看数据,填充不存在,这让我认为这是 xdevapi 包中某处的问题。

我使用的查询是:

SELECT accessKey, date FROM datasets WHERE authString = '<string we're searching by>';

该查询实际使用的 JS 是:

let query = database.getTable('datasets').select('accessKey','date').where('authString = :auth').bind('auth', authString);
await query.execute(row =>
    {
        if (!Array.isArray(data)) data = [];
        let cDate = new Date(row[1]);
        console.log(row[0]);
        data.push([
            row[0].slice(0, 6),    //Manually trim padding
            cDate.toDateString()
            ]);
    });

console.log() 将以下内容打印到控制台:

1af55d000000000000
1d4da5000000000000
48e027000000000000
2a148d000000000000
255d4c000000000000

这些值是正确的,只是附加了额外的 0。预期结果只是前 6 个字符。

最佳答案

这里发生了两件事。

首先是您正在使用固定长度列数据类型CHAR(n),它由 X Protocol 指定。 ,当结果集值的长度小于为列数据类型定义的固定长度(以字节为单位)时,将需要额外的填充。

第二个是填充字符在您的情况下可能不正确(如果您使用 utf8mb4 字符集),它应该是 ' ' 而不是0x00,这是一个错误。

另一件事是 utf8mb4 字符集定义每个字符 4 个字节,这意味着以字节为单位的实际字段长度将是 24 个字节,并且您的情况下的预期输出将是:

'1af55d                  ' 
'1d4da5                  '
'48e027                  '
'2a148d                  '
'255d4c                  '

这可能有点奇怪,并且将来有可能改变。但是,至少在这种情况下,您可以使用 .trim() 并且不关心值的长度。在它发生变化或错误得到修复之前,您始终可以使用 VARCHAR 来防止这种情况发生。

免责声明:我是 Node.js 的 MySQL X DevAPI 连接器的首席开发人员

关于mysql - 为什么 MySQL 在查询结果末尾添加不必要的填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56972638/

相关文章:

php - 只打印第一轮 div 的循环 php

mysql - MySQL 中何时使用单引号、双引号和反引号

sql - 我应该使用子查询吗?

javascript - 如何使用模块mysql在nodejs上列出mysql中的列

javascript - Socket.io - 旧版本的 app.js 到新版本的 socket.io

php - 创建动态 SQL 搜索

mysql - 通过连接表字段查找精确的重复项

PHP MySQL 分页问题——附加页面显示所有行

php - 具有 2 个条件的同一张表上的 SQL JOIN

node.js - 更改 Phonegap 上 Nodejs 的目标 sdk