我正在从 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/