2017-01-30 3 views
0

Я рассмотрел много вопросов относительно этой проблемы, но я не нашел решения. Надеюсь, это не дублирующий вопрос.MySql IEEE с плавающей запятой NaN, PositiveInfinity, NegativeInfinity

Проблема

Если я любой из:

INSERT INTO `Numbers`(`Number`) VALUES ('NaN') 
INSERT INTO `Numbers`(`Number`) VALUES ('Inf') 
INSERT INTO `Numbers`(`Number`) VALUES ('+Inf') 

я получаю 0.0 вставленные в таблице. Иногда я получаю:

Error Code: 1265. Data truncated for column 'Number' 

Я также пробовал различные корпуса и орфографию, все с тем же эффектом.

Я даже пробовал:

INSERT INTO `Numbers`(`Number`) VALUES ('1111111111111000000000000000000000000000000000000000000000000000') 

Как вставить число NaN с плавающей запятой в таблицу MySql?

Если это действительно невозможно, то что такое рассуждение? (Может быть, я использую неправильную версию MySql?)

Использование NULL в качестве NaN

таблицы, где я на самом деле с помощью этого я не хочу, чтобы NULL значения в этих столбцах. Так что мне не нравится идея замены NaN с NULL где-то в ORM слое

+0

Вы, скорее всего, не получите ошибку, потому что сеанс настроен с использованием старого SQL_MODE. И, извините, вы можете хранить только конечные числа. –

+0

Хорошо. У вас есть идея, почему это так? Я предполагаю, что команда MySql не просто забыла об этом. Должно быть, они сделали выбор по какой-то причине? – smerlung

+0

Цитирование [Raymond Chen] (https://blogs.technet.microsoft.com/seanearp/2007/04/12/why-doesnt-this-feature-exist/): * Ответ на вопрос «Почему эта функция не используется? существуют? "обычно" По умолчанию функции не существуют. Кто-то должен их реализовать ». Это не похоже на то, что каждая функция, которую вы можете придумать, выходит из вашего мозга, полностью протестирована и реализована, а затем где-то в PM помещается ошибка, чтобы удалить вашу функцию. Функции начинают отсутствовать, и кто-то должен их заставить. * –

ответ

0

Чтобы получить общее представление о том, как MySQL манипулирует номера вы можете прочитать следующие главы:

В последней статье упоминает об этом:

Сервер включает в себя dtoa, библиотека преобразования, который обеспечивает основу для улучшения преобразования между строкой или DECIMAL значений и приблизительной стоимости (FLOAT/DOUBLE) чисел

[...]

библиотека dtoa обеспечивает преобразование с го e следующие свойства. D представляет значение с DECIMAL или строковым представлением, а F представляет число с плавающей запятой в бинарном (IEEE) формате.

[...]

преобразования являются без потерь, если F не -inf, +inf или NaN.Последние значения не поддерживаются, поскольку стандарт SQL определяет их как недопустимые значения для FLOAT или DOUBLE.

Короче:

  • Стандарт SQL явно запрещает эти значения
  • MySQL соответствует стандарту в этом аспекте
Смежные вопросы