MySQL SELECT 不检查值是否准确

MySQL SELECT doesn't checks if the value is exact

我目前正在使用 JS、DiscordJS 和 MySQL 并尝试从 table 获取一些数据,这些数据通常总是工作正常。但是我正在努力处理 MySQL SELECT 查询,因为它不会检查 table 中的值是否与它正在搜索的值完全相同。 Discord ID 的末尾与其正在搜索的不同。

代码:

let query = `SELECT * FROM accounts WHERE DiscordID = ${interaction.member.id}`;
console.log(`QUERY: ` + query);
MySQL.Connect()
    .then((connection) => {
        MySQL.Query(connection, query)
            .then((results) => {
                if (results == '') {
                    console.log('[RESULTS = 0]');
                    console.log(results);
                } else {
                    console.log('[RESULTS > 0]');
                    console.log(results);
                }
            })
            .catch((error) => {
                console.log(error);
            })
            .finally(() => {
                connection.end();
            });
    })
    .catch((error) => {
        console.log(error);
    });

结果:

QUERY: SELECT * FROM accounts WHERE DiscordID = 466934561738326016

RESULT: 
ID: 1,
Username: 'Test',
Password: 'Test',
DiscordID: '466934561738326022'

MySQL 架构:

CREATE TABLE IF NOT EXISTS `accounts` (
`ID` INT NOT NULL AUTO_INCREMENT, 
`Username` VARCHAR(255) NOT NULL, 
`Password` VARCHAR(255) NOT NULL, 
`DiscordID` VARCHAR(100) NOT NULL, 
PRIMARY KEY (`ID`));

你被MySQL对数字的处理给坑了。

你说,

SELECT * FROM accounts WHERE DiscordID = 466934561738326016

MySQL 把那个长数字默默地转换成 IEEE 754 64-bit floating point number,失去了精度。做 SELECT 466934561738326016; 得到你 466934561738326000。有时会匹配错误的 DiscordID。 !!

如果您在 ID 周围加上引号,那么 MySQL 会将 ID 值原封不动地保留为文本字符串。有效。

SELECT * FROM accounts WHERE DiscordID = '466934561738326016'

在这里查看。 fiddle