Sannis / node-mysql-libmysqlclient

Asynchronous MySQL binding for Node.js
http://sannis.github.com/node-mysql-libmysqlclient
Other
229 stars 47 forks source link

Invalid type conversation BIGINT to JS number #110

Closed avz closed 12 years ago

avz commented 12 years ago

Really big integers such as 123456789012345678 converted to number 123456789012345680, as well as parseInt('123456789012345678') = 123456789012345680.

Проблема явно тут:

case MYSQL_TYPE_TINY: // TINYINT field
case MYSQL_TYPE_BIT: // BIT field (MySQL 5.0.3 and up)
case MYSQL_TYPE_SHORT: // SMALLINT field
case MYSQL_TYPE_LONG: // INTEGER field
case MYSQL_TYPE_INT24: // MEDIUMINT field
case MYSQL_TYPE_LONGLONG: // BIGINT field
case MYSQL_TYPE_YEAR: // YEAR field
    if (field_value) {
        js_field = V8STR(field_value)->ToInteger();
    }
    break;

Даже не представляю как её можно решить, не сломав обратную совместимость. Похоже, единственным рабочим костылём будет возможность опцией отключить преобразование всех mysql-типов в js-типы (как предлагают в соседнем фичреквесте), или опция для отключения преобразования конкретно для типов, в которых могут храниться числа, которые не могут быть представлены аналогичными js типами без потери точности (сейчас это, похоже, только BIGINT и DECIMAL большой длины)

Sannis commented 12 years ago

Yes, such numbers does not fit in Javascript Number type. I plan to implement driver option to disbale type casting, see #95.

Тем более что сейчас никто на 32-битную ОС базы данных не ставит. При изменении версии можно и сломать тут совместимость. Но лучше сделаю параметр вида кастовать/не кастовать bigint/не кастовать ничего.

Как думаете, будет удобнее для использования сделать это опцией result.fetch*() или всего соединения? или модуля, для всех соединений сразу?

avz commented 12 years ago

Я думаю, как минимум надо дать возможность менять опцию на уровне result.fetch*(). Можно ещё сделать возможность менять дефолтное значение на уровне соединения. С одной стороны удобно менять глобально и, в то же время, если вдруг понадобится другое поведение, то можно будет изменить только в каком-то конкретном месте

Sannis commented 12 years ago

Ок, подумаем-с.