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

时间:2019-07-10 14:13:38

标签: mysql sql node.js

我正在从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个字符。

1 个答案:

答案 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的首席开发人员