За последние 24 часа нас посетили 15163 программиста и 1671 робот. Сейчас ищут 986 программистов ...

Преобразование данный из строки в INT , REAL

Тема в разделе "MySQL", создана пользователем jacaranda, 15 июн 2010.

  1. jacaranda

    jacaranda Активный пользователь

    С нами с:
    9 июн 2010
    Сообщения:
    11
    Симпатии:
    0
    У меня есть данные в базе данных как INT и REAL, информацию из формы я читаю, как строку. Надо ли преобразовывать строку в численные данные?
    (дело в том, что у меня программа работала без преобразования, а сейчас, когда я ввела смесь букв и цифр , то получила ощибку.)

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
    (что такое line 1? Это первая строка SQL? Или моего кода на рнр?)

    Может ли быть причиной эти непреобразованные данные?
    (если ошибка в синтаксисе, то почему она в большинстве случаев работает?)
    UPDATE inventory SET pot_size='60', price='2', qoh='10o', image='images/orange_jasmine.jpg' WHERE invID=3

    Вот при изменении qoh='10' на qoh='10o'
    1 раз сработала без ошибки, другой раз с ошибкой.
    (когда срабатывает, то буквы просто отбрасываются и записывается 10 в бд)
    в phpMyAdmin этот SQL запрос срабатывает нормально.

    Извините, что сумбурно.
     
  2. jacaranda

    jacaranda Активный пользователь

    С нами с:
    9 июн 2010
    Сообщения:
    11
    Симпатии:
    0
    спасибо. пошла читать.
     
  3. Einbaukueche

    Einbaukueche Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Там, где много гор и пива.
    Это строка SQL запроса.

    -------------

    @jacaranda
    Приведите, пожалуйста,

    а) структуры таблицы inventory


    б) SQL MODE во время запроса, ибо может быть и так:
    Код (Text):
    1.  
    2. mysql> select @@session.sql_mode;
    3. +--------------------+          
    4. | @@session.sql_mode |          
    5. +--------------------+          
    6. |                    |          
    7. +--------------------+          
    8. 1 row in set (0.00 sec)          
    9.  
    10.  
    11. mysql> create table testsqlmode (someint int );
    12. Query OK, 0 rows affected (0.01 sec)          
    13.  
    14. mysql> insert into testsqlmode values(10);
    15. Query OK, 1 row affected (0.00 sec)      
    16.  
    17. mysql> insert into testsqlmode values('10');
    18. Query OK, 1 row affected (0.00 sec)        
    19.  
    20. mysql> insert into testsqlmode values('10a');
    21. Query OK, 1 row affected, 1 warning (0.00 sec)
    22.  
    23. mysql> select * from testsqlmode;
    24. +---------+                      
    25. | someint |                      
    26. +---------+                      
    27. |      10 |                      
    28. |      10 |                      
    29. |      10 |
    30. +---------+
    31. 3 rows in set (0.00 sec)
    32.  
    33. mysql> select @@session.sql_mode;
    34. +--------------------+
    35. | @@session.sql_mode |
    36. +--------------------+
    37. |                    |
    38. +--------------------+
    39. 1 row in set (0.00 sec)
    40.  
    41. mysql> set @@session.sql_mode = STRICT_ALL_TABLES;
    42. Query OK, 0 rows affected (0.00 sec)
    43.  
    44. mysql> select @@session.sql_mode;
    45. +--------------------+
    46. | @@session.sql_mode |
    47. +--------------------+
    48. | STRICT_ALL_TABLES  |
    49. +--------------------+
    50. 1 row in set (0.00 sec)
    51.  
    52. mysql> insert into testsqlmode values('10a');
    53. ERROR 1265 (01000): Data truncated for column 'someint' at row 1
    54. mysql> insert into testsqlmode values('20a');
    55. ERROR 1265 (01000): Data truncated for column 'someint' at row 1
    56. mysql> insert into testsqlmode values('20');
    57. Query OK, 1 row affected (0.00 sec)
    58.  
    59. mysql> insert into testsqlmode values(20);
    60. Query OK, 1 row affected (0.00 sec)
    61.  
    62. mysql> select * from testsqlmode;
    63. +---------+
    64. | someint |
    65. +---------+
    66. |      10 |
    67. |      10 |
    68. |      10 |
    69. |      20 |
    70. |      20 |
    71. +---------+
    72. 5 rows in set (0.00 sec)
     
  4. jacaranda

    jacaranda Активный пользователь

    С нами с:
    9 июн 2010
    Сообщения:
    11
    Симпатии:
    0
    CREATE TABLE inventory (
    invID INT NOT NULL AUTO_INCREMENT,
    itemID INT NOT NULL,
    pot_size INT NOT NULL,
    price REAL NOT NULL,
    qoh INT NOT NULL,
    image VARCHAR(30),
    PRIMARY KEY (invID),
    FOREIGN KEY (itemID) REFERENCES item(itemID)
    ) TYPE=INNODB
    ;

    надо ли указывать размерность для INT , REAL?
    еще непонятно, я создаю таблицу как INNODB, а в MyphpAdmin тип MyISAM, и поменять нельзя. там нет такой опции.
     
  5. jacaranda

    jacaranda Активный пользователь

    С нами с:
    9 июн 2010
    Сообщения:
    11
    Симпатии:
    0
    cпасибо, попробую
     
  6. Einbaukueche

    Einbaukueche Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Там, где много гор и пива.
    Только не забудьте попробовать именно в том контексте, в котором у вас происходит ошибка, то есть прямо перед тем самым падающим запросом в скрипте.

    В данном случае это не играет никакой роли.

    REAL - если не указать вообще, то будет использоваться максимальная точность, которая возможно в системе, где установлена MySQL.

    INT - не надо вообще. Очень распостранённо ложное мнение, что, например INT(1) будет использовать меньше памяти и меньше "вмещать" чем INT(4). Цифра в данном случае указывает количество цифр, которые будут как минимум отображаться в некоторых ситуациях, например при использовании опции ZEROFILL.

    В этом примере все 3 поля вмещают и занимают одинаковую величину байтов в памяти.
    Код (Text):
    1.  
    2. mysql> create table this_is_not_the_size (a int(1) zerofill, aa int(2) zerofill, aaaa int(4) zerofill);
    3. Query OK, 0 rows affected (0.08 sec)
    4.  
    5. mysql> insert into this_is_not_the_size values (1,1,1);
    6. Query OK, 1 row affected (0.00 sec)
    7.  
    8. mysql> insert into this_is_not_the_size values (22,22,22);
    9. Query OK, 1 row affected (0.00 sec)
    10.  
    11. mysql> insert into this_is_not_the_size values (4444,4444,4444);
    12. Query OK, 1 row affected (0.00 sec)
    13.  
    14. mysql> select * from this_is_not_the_size;
    15. +------+------+------+
    16. | a    | aa   | aaaa |
    17. +------+------+------+
    18. |    1 |   01 | 0001 |
    19. |   22 |   22 | 0022 |
    20. | 4444 | 4444 | 4444 |
    21. +------+------+------+
    22. 3 rows in set (0.00 sec)
    Как видно, 4444 отлично вместилось в INT(1), то есть это не 1 байт. (а 4)


    Если в данном случае InnoDB у вас не встроена, либо не активирована, то MySQL самостоятельно использует для создания таблицы движок MyISAM (либо другой, который установлен у вас как стандартный, если вы ничего не меняли, то это MyISAM).
     
  7. jacaranda

    jacaranda Активный пользователь

    С нами с:
    9 июн 2010
    Сообщения:
    11
    Симпатии:
    0
    повторила ваш скрипт, все так и получается.
    т.е. мне надо
    1. считать строку с буквами ошибочной
    или
    2. преобразовывать ее к целому или действителльному( соответственно) и потом записывать в бд?
     
  8. jacaranda

    jacaranda Активный пользователь

    С нами с:
    9 июн 2010
    Сообщения:
    11
    Симпатии:
    0
    не поняла. у меня это все случайно получается, то работает, то нет.

    спасибо большое за ответы.
     
  9. jacaranda

    jacaranda Активный пользователь

    С нами с:
    9 июн 2010
    Сообщения:
    11
    Симпатии:
    0
    еще вопросы.
    1. когда надо закрывать коннекшен с бд (mysql_close($con);)?
    это надо делать, покидая каждую страницу, а на новой снова ее открывать?
    2. обязательно ли делать это фри
    <?php
    mysql_free_result($rs_GetSomething);
    ?>
    в конце страницы?
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    1а. В стандартных скриптах закрывать не обязательно. Все подключения (mysql_connect) будут закрыты автоматически при завершении скрипта.
    1б. Да, на каждой странице посещаемой пользователем надо снова подключаться к БД.
    Есть некоторые приемы позволяющие не дублировать этот код во всех скриптах, а держать его в одном месте.
    2. Аналогично п.1а
     
  11. jacaranda

    jacaranda Активный пользователь

    С нами с:
    9 июн 2010
    Сообщения:
    11
    Симпатии:
    0
    спасибо всем!
     
  12. Einbaukueche

    Einbaukueche Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Там, где много гор и пива.
    У вас в скрипте где-то же есть строка $result = mysql_query("UPDATE ...") или похожее на неё, где вы пробуете записать '10a' в INT? Вот прямо перед этим запросом, спросите у MySQL, в каком режиме она работает на тот момент через:
    Код (Text):
    1.  
    2. SELECT @@GLOBAL.sql_mode;
    Код (Text):
    1.  
    2. SELECT @@SESSION.sql_mode;
    Выводите эти 2 значения (обратите внимание, что они могут быть просто пустыми) или записывайте их в error log или еще куда, короче с целью, как-нибудь узнать эти 2 параметра в момент (не-)исполнения вашего запроса.

    Не, его не надо было повторять. ;) Это я просто для наглядности пример привёл, что может случится, и что как раз похоже по симптомам на ваш случай. Вот тут можете прочитать подробней про режим SQL.
    http://dev.mysql.com/doc/refman/5.0/en/ ... -mode.html

    Ну, можно и так и так, зависит от того, желаете ли вы как-то "спасать" плохие данные или нет. И если да, то самой базой данных или еще до этого - в PHP? Если вы в состоянии изменить ту систему, которая записывает такие данные вам в БД (другими словами, если это ваш код PHP, а не какой-то чужой, которые вы не можете править), то я лично стал бы вылавливать/править такие данные еще до их поступа в БД, прямо в PHP. То есть ваш вариант 1. Если вы хотите "прощать" такие данные, то это так же можно сделать и в PHP.

    Что вообще-то приводит к главному вопросу. Откуда у вас вообще эта "10а", которую вы пытаетесь записать как INT?
    Не прямо из входных данных GEТ/POST итд. случайно?
     
  13. jacaranda

    jacaranda Активный пользователь

    С нами с:
    9 июн 2010
    Сообщения:
    11
    Симпатии:
    0
    Einbaukueche, спасибо за объяснения.
    "10а" у меня просто из GEТ/POST. проверяла, что будет, если пользователь вводит неверные данные.
    ошибка была в другом месте, она не связана с преобразованием строки в численный данные, но я везде сделела эти преобразования, чтобы в дальнейшем чего-нибудь нового не вылезло.