Передача від VARCHAR до INT - MySQL


267

Мої поточні дані для

SELECT PROD_CODE FROM `PRODUCT`

є

PROD_CODE
2
5
7
8
22
10
9
11

Я перепробував усі чотири запити, і жоден не працює. ( Посилання )

SELECT CAST(PROD_CODE) AS INT FROM PRODUCT;

SELECT CAST(PROD_CODE AS INT) FROM PRODUCT;

SELECT CAST(PROD_CODE) AS INTEGER FROM PRODUCT;

SELECT CAST(PROD_CODE AS INTEGER) FROM PRODUCT;

Усі помилки синтаксису, які наведено нижче:

Ви маєте помилку в своєму синтаксисі SQL; перевірте посібник, який відповідає вашій версії сервера MySQL, чи правильно використовувати синтаксис біля ') ЯК ВІД МІЖ ПРОДУКТУ 0, 30' у рядку 1

Ви маєте помилку в своєму синтаксисі SQL; перевірте посібник, що відповідає вашій версії сервера MySQL, чи правильний синтаксис для використання поруч із "INTEGER) ВІД ПРОДУКЦІЙНОГО ОБМЕЖЕННЯ 0, 30" у рядку 1

Який правильний синтаксис для передачі varchar цілому числу в MySQL?

Версія MySQL: 5.5.16


Про яку помилку повідомляється для кожної спроби? Які ваші входи? Якщо запит не вдасться до будь-якого запису в наборі результатів, він повинен провалити запит. Принаймні, так говорить стандарт sql, хоча MySql відомий тим, що порушує правила безпеки в стандарті. І, для запису, 2 та 4 перераховані зразки є правильними.
Joel Coehoorn

Відповіді:


552

Як описано в функціях ролях і операторів :

Тип для результату може мати одне з наступних значень:

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

Тому слід використовувати:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT

7
Без підпису працює. Відколи MySQL змінив тип даних Integer на Непідписаний?
Ленін Радж Раджасекаран

20
@emaillenin: типи даних для кастингу не такі, як типи для стовпців, оскільки потрібна додаткова інформація про інтерпретацію даних, наприклад, чи є цілі числа підписані чи ні.
eggyal

13
Дякую за цю інформацію Документація на MySQL для мене хаотична, тому це дуже допомогло.
Рекі

У мене виникли проблеми з CAST (num_col AS DOUBLE (10,2)). Пізніше я змінив його на DECIMAL (10,2), і він спрацював. Tnanks
Nava Bogatee

Зауважте, що на MariaDB CAST(PROD_CODE AS INT) працює просто чудово.
Пол Шпігель

56

Для викидання полів / значень у формат чисел може бути мало зламано:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT`

9
Навіщо коли-небудь користуватися таким "хаком", коли існує пряме, документально підтверджене, підтримуване та рекомендоване рішення?
eggyal

31
@eggyal TL; DR: "хак", про який ви згадуєте , - це просте, документоване та рекомендоване рішення. - - - - - - - - - - - - - Довга версія : З посібника : To cast a string to a number, you normally need do nothing other than use the string value in numeric contextХоча я б використовував +0замість того, що *1додавання швидше.
Міндвін

8
@BrianStinar у прийнятій відповіді чітко видно, що існує рішення з кращою семантикою, але іноді просто зручно, що примітивне значення неявно перекидається на інший примітив, особливо при поєднанні рядків і числових типів. Тож випадково базування мов програмування для існування цієї функції здається досить недоречним.
B12Toaster

Не використовуйте цей тип хакерів! - дуже погана практика, яка відкуситься набагато пізніше, коли код буде наповнений цими і важко повернути
ночі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.