Приведение из 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, чтобы найти правильный синтаксис для использования рядом с ') AS INT FROM PRODUCT LIMIT 0, 30' в строке 1

У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который следует использовать рядом с «INTEGER) ОТ ОГРАНИЧЕНИЯ ПРОДУКТА 0, 30» в строке 1

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

Версия MySQL: 5.5.16

Ленин Радж Раджасекаран
источник
О какой ошибке он сообщает при каждой попытке? Каковы ваши входы? Он должен провалить запрос , если бросок не выполняется для любой записи в наборе результатов. По крайней мере, так говорится в стандарте sql, хотя MySql печально известен нарушением правил безопасности в стандарте. И, для записи, 2-й и 4-й перечисленные образцы верны.
Джоэл Коухорн

Ответы:

552

Как описано в Функции и Операторы Приведения :

Тип результата может быть одним из следующих значений:

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

Поэтому вы должны использовать:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT
eggyal
источник
7
Без подписи работает. С каких пор MySQL изменил тип данных Integer на Unsigned?
Ленин Радж Раджасекаран
20
@emaillenin: типы данных для приведения не совпадают с типами для столбцов, поскольку требуется дополнительная информация о том, как интерпретировать данные, например, подписаны ли целые числа или нет.
рождения
13
Спасибо за эту информацию. Документация MySQL для меня хаотична, так что это очень помогло.
Racky
У меня были проблемы с CAST (num_col AS DOUBLE (10,2) .. Позже я сменил его на DECIMAL (10,2), и он заработал. Tnanks
Nava Bogatee
Обратите внимание, что на MariaDB CAST(PROD_CODE AS INT) работает просто отлично.
Пол Шпигель
57

Для приведения полей / значений varchar в числовой формат может быть использован небольшой взлом:

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
Не используйте этот тип хаков! - очень плохая практика, которая откусит намного позже, когда код будет полон и их трудно отменить
ночи
с этим ответом я нашел несколько раз, заканчивая с float64, поэтому я предпочитаю использовать CONVERT('123456',UNSIGNED INTEGER)
Ицхак Вейнгартен