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

Статус
В этой теме нельзя размещать новые ответы.

marvinz

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

2,22000000000000E-002

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

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

2

вопрос, как поместить значение в поле правильно? (изменить тип, заранее в скрипте что-то указать, кто сталкивался или знает как сделать помогите пожалуйста. из-за этого моего косяка ничего не работает)
 
Попробуй вместо десятичного знака точку писать, а не запятую. А то обрезка данных выходит
 
Сначало переведи переменную в строку, потом вставляй в запрос, попробуй longdouble
 
antidote, ТОЧНО! проверил в PhpMyAdmin и заметил варнинг:

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

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

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

UPD: только сделай сначала проверку на наличие точки в строке, а то бяка может получаться
 
как я понимаю - наличие точки или запятой как разделителя выбирается программой автоматически в зависимости от локали.

напомню что путь проходимый данными:
программа на Дельфи -> ПХП скрипт (гет) -> 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);

возможно еть другие варианты для учета локали?
 
Локаль здесь врятли влияет. Запятая - разделитель в синтаксисе SQL, если бы она использовалась в записи чисел, были бы такие неоднозначности:

SELECT 1,2

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

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

Пробел сам по себе появиться не мог, нужно смотреть что ушло от Delphi, что принял PHP, что он с этим вытворял и на какой стадии этот пробел всплывает.
 
вспомнил, в SQL можно же еще и так
Код:
replace (@var, ',', '.')
тогда не надо делать проверку наличия десятичного разделителя. По идее от пробелов можно избавиться таким же образом, но это наверно не будет правильным.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху