Помогите с типом переменной Mysql

Тема в разделе "Базы данных", создана пользователем marvinz, 29 июл 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. marvinz

    marvinz

    Регистр.:
    7 апр 2009
    Сообщения:
    163
    Симпатии:
    75
    Друзья-специалисты, прошу вашей помощи:
    есть переменная типа дабл, которая поступает в мой пхп скрипт гет запросом из программы на дельфях пример значения:

    2,22000000000000E-002

    я ее записываю инсертом в поле таблицы MySql имеющее тип DOUBLE

    в итоге в ячейке оказывается та часть что идет до запятой, тоесть в нашем случае

    2

    вопрос, как поместить значение в поле правильно? (изменить тип, заранее в скрипте что-то указать, кто сталкивался или знает как сделать помогите пожалуйста. из-за этого моего косяка ничего не работает)
     
  2. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Попробуй вместо десятичного знака точку писать, а не запятую. А то обрезка данных выходит
     
    marvinz нравится это.
  3. Atec

    Atec

    Регистр.:
    28 апр 2007
    Сообщения:
    296
    Симпатии:
    31
    Сначало переведи переменную в строку, потом вставляй в запрос, попробуй longdouble
     
  4. marvinz

    marvinz

    Регистр.:
    7 апр 2009
    Сообщения:
    163
    Симпатии:
    75
    antidote, ТОЧНО! проверил в PhpMyAdmin и заметил варнинг:

    1 row(s) affected.
    Warning: #1265 Data truncated for column 'dp' at row 1

    поменял на точку вставилось нормально. теперь возникает вопрос как мне запятую точкой подменить в запросе?

    Atec, а что даст лонгдабл? и перевод нужно на каком этапе осуществлять?
     
  5. Atec

    Atec

    Регистр.:
    28 апр 2007
    Сообщения:
    296
    Симпатии:
    31
    лонгдабл даст больше разрядов если их не хватает, а перед тем как засунуть переменную в запрос - ее лучше преобразовать в строку, насчет разделителей, ну понятно если в системе разделитель . то и у вас должна быть . если , то и у вас должна быть запятая... (я как бы и не думал что может быть разница).
     
    marvinz нравится это.
  6. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Поменять запятую на точку можно используя конкатенацию подстрок полученых с помощью SUBSTRING или LEFT/RIGHT.
    Код:
    CAST (
    SUBSTRING(@Str, 1, CHARINDEX(',', @str) - 1) + '.' + 
    SUBSTRING(@Str, CHARINDEX('.', @Str) + 1, LEN(@Str))
    AS DOUBLLE)
    
    UPD: только сделай сначала проверку на наличие точки в строке, а то бяка может получаться
     
    marvinz нравится это.
  7. marvinz

    marvinz

    Регистр.:
    7 апр 2009
    Сообщения:
    163
    Симпатии:
    75
    как я понимаю - наличие точки или запятой как разделителя выбирается программой автоматически в зависимости от локали.

    напомню что путь проходимый данными:
    программа на Дельфи -> ПХП скрипт (гет) -> MySql

    обрезание же происходило из-за двух вещей - из-за запятой + из-за пробела который вставлялся откуда-то (может после прихода Get запроса возникает) т.е.(для большого и маленького числа:(

    5,0e-007 -> обрезание MySql -> 5 (для большого также будет)
    +
    5.0e-007 -> 5.00000000000000E-007 -> 5e-007
    5.0e007 -> 5.00000000000000E 007 (!! внимание пробел!!!) -> 5

    оценив все ваши рекомендации придумал решение:
    а) в программе дельфи всегда высылать точку разделителем
    б) в ПХП скрипте убивать пробел командой
    $T = str_replace(' ', '', $T);

    возможно еть другие варианты для учета локали?
     
  8. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    Локаль здесь врятли влияет. Запятая - разделитель в синтаксисе SQL, если бы она использовалась в записи чисел, были бы такие неоднозначности:

    SELECT 1,2

    Выбрать 1 поле со значением double 1.2;
    либо 2 поля со значениями int 1 и int 2;
    и то и другое должно быть всегда доступно вне зависимости от настроек.

    Если всё же локаль окажется виноватой, то её всегда можно выставить принудительно.

    Пробел сам по себе появиться не мог, нужно смотреть что ушло от Delphi, что принял PHP, что он с этим вытворял и на какой стадии этот пробел всплывает.
     
  9. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    вспомнил, в SQL можно же еще и так
    Код:
    replace (@var, ',', '.')
    
    тогда не надо делать проверку наличия десятичного разделителя. По идее от пробелов можно избавиться таким же образом, но это наверно не будет правильным.
     
Статус темы:
Закрыта.