MySQL SELECT 不检查值是否精确 [duplicate]

MySQL SELECT doesn't checks if the value is exact [duplicate]

提问人:TheDivine 提问时间:2/22/2022 最后编辑:O. JonesTheDivine 更新时间:2/22/2022 访问量:40

问:

我目前正在使用 JS、DiscordJS 和 MySQL,并试图从表中获取一些数据,这些数据通常总是可以正常工作。但是我正在为MySQL SELECT查询而苦苦挣扎,因为它不会检查表中的值是否与搜索的值相同。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`));
JavaScript MySQL 不和谐 .js 精度

评论

1赞 2/22/2022
尝试SELECT * FROM accounts WHERE DiscordID = "${interaction.member.id}";
0赞 TheDivine 2/22/2022
工作正常,非常感谢。我没想到它会有这么大的区别。
2赞 2/22/2022
确实如此,因为数字类型是有限的,但字符串可能很长。

答:

0赞 O. Jones 2/22/2022 #1

你被MySQL对数字的处理咬住了。

你说,

SELECT * FROM accounts WHERE DiscordID = 466934561738326016

MySQL采用了这个长数字,并将其静默地转换为IEEE 754 64位浮点数,从而失去了精度。做得到你.有时,这与错误的 DiscordID 匹配。!!SELECT 466934561738326016;466934561738326000

如果将 ID 括起来,则这样做,MySQL 会将 ID 值保留为文本字符串。它有效。

SELECT * FROM accounts WHERE DiscordID = '466934561738326016'

在这里查看。小提琴