MySQL возвращает неправильное значение, только когда число больше - PullRequest
0 голосов
/ 07 ноября 2018

Я пишу бота, в котором хранятся значения. Одним из которых является количество из 18 мест. Я могу правильно хранить значения в моей базе данных MySQL как BIGINT [20]. Сохраняемые значения верны.

Проблема возникает при попытке получить этот номер. Значение, хранящееся в базе данных, составляет 502033097630416897, однако фактическое значение, возвращаемое mysql, равно 502033097630416900. Для сравнения, здесь они снова:

502033097630416900
502033097630416897

Кажется, что возвращаемое значение либо округляется, либо изменяется. Я хотел проверить эту теорию, поэтому я изменил значение, хранящееся в MySQL, на меньшее число, 123, 1234567 и так далее. Возвращаемые значения на самом деле верны. По некоторым причинам возвращенные значения являются неправильными, если числа, хранящиеся в MySQL, слишком велики. Я бы опубликовал свой код для хранения, но я не думаю, что это уместно, так как фактическое значение сохраняется правильно.

Что касается вызова, у меня есть функция, которая может получить множественный возврат new

Promise((success, fail) => {
    con.query(`SELECT * FROM serversettings WHERE serverId = ${serverID}`, (err, rows) => {
        switch(type){
            case "onjoin":
                success(rows[0].onjoin);

Где тип - это данные, которые я хочу получить. Любое понимание будет полезно, спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Javascript выполняет арифметику с использованием 64-битных чисел с плавающей точкой IEEE 754 . В такой арифметике два числа в вашем примере равны друг другу; IEEE 754 предлагает только около 16 десятичных цифр точности.

Чтобы обработать эти числа в Javascript, вы должны либо работать с ними, как если бы они были текстовыми строками, либо использовать пакет для длинных чисел.

Если вы измените свой запрос на

SELECT CAST(bigint_column AS CHAR) bigint_column, other, else, etc
  FROM serversettings 
  ...

Вы получите строки символов.

...