我正在从MySQL数据库中查询数据,但是在字段的总长度之后,填充已附加到数据的末尾。
这是使用mysql/xdevapi package在Node.js中运行并查询MySQL Server 8.0.16社区。所选的列定义为cat file*.txt > merged_file.txt
。
通过MySQL Workbench查看数据时,不存在填充,这使我认为这是xdevapi包中某个地方的问题。
我正在使用的查询是:
accessKey CHAR(6)
此查询使用的实际JS是:
SELECT accessKey, date FROM datasets WHERE authString = '<string we're searching by>';
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()
值是正确的,只是附加了0。预期的结果只是前6个字符。
答案 0 :(得分:1)
这里发生两件事。
第一个是您使用的是定长列数据类型CHAR(n)
,它由X Protocol指定,当结果集值的长度小于固定值时,将需要附加填充列数据类型定义的最大长度(以字节为单位)。
第二个原因是您的情况下填充字符可能不正确(如果您使用的是utf8mb4
字符集),则应该是' '
而非0x00
,并且那是一个错误。
另一件事是utf8mb4
字符集为每个字符定义了4个字节,这意味着以字节为单位的实际字段长度将为24个字节,并且在您的情况下预期的输出将是:
'1af55d '
'1d4da5 '
'48e027 '
'2a148d '
'255d4c '
这可能有点奇怪,并且将来有可能改变。但是,至少在这种情况下,您将能够使用.trim()
而不关心值的长度。在更改或修复该错误之前,您始终可以使用VARCHAR
来防止这种情况发生。
免责声明:我是MySQL X DevAPI Connector for Node.js的首席开发人员