Приведение из 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

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)
Ицхак Вейнгартен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.