Transmitido de VARCHAR para INT - MySQL

267

Meus dados atuais para

SELECT PROD_CODE FROM `PRODUCT`

é

PROD_CODE
2
5
7
8
22
10
9
11

Eu tentei todas as quatro consultas e nenhuma funcionou. ( Ref )

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;

Todos lançam erros de sintaxe como abaixo:

Você tem um erro na sua sintaxe SQL; verifique o manual que corresponde à versão do servidor MySQL para a sintaxe correta a ser usada perto de ') AS INT FROM PRODUCT LIMIT 0, 30' na linha 1

Você tem um erro na sua sintaxe SQL; verifique o manual que corresponde à versão do servidor MySQL para obter a sintaxe correta perto de 'INTEGER) FROM PRODUCT LIMIT 0, 30' na linha 1

Qual é a sintaxe correta para converter varchar para inteiro no MySQL?

Versão do MySQL: 5.5.16

Lenin Raj Rajasekaran
fonte
Que erro ele relata para cada tentativa? Quais são as suas entradas? É suposto falhar na consulta se a conversão falhar em qualquer registro no conjunto de resultados. Pelo menos, é o que diz o padrão sql, embora o MySql seja notório por violar as regras de segurança do padrão. E, para o registro, as 2ª e 4ª amostras listadas estão corretas.
Joel Coehoorn

Respostas:

552

Conforme descrito em Funções e operadores de transmissão :

O tipo para o resultado pode ser um dos seguintes valores:

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

Portanto, você deve usar:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT
eggyal
fonte
7
Não assinado está funcionando. Desde quando o MySQL mudou o tipo de dados Inteiro para Unsigned?
Lenin Raj Rajasekaran
20
@emaillenin: Os tipos de dados para conversão não são iguais aos das colunas, pois são necessárias informações adicionais sobre como interpretar os dados, por exemplo, se números inteiros são assinados ou não.
eggyal 26/08/12
13
Obrigado por esta informação. A documentação do MySQL é caótica para mim, então isso ajudou muito.
Racky 29/10/2013
Eu estava tendo problemas com CAST (num_col como duplo (10,2) .. Mais tarde eu mudei para DECIMAL (10,2) e funcionou Tnanks.
Nava Bogatee
Observe que no MariaDB CAST(PROD_CODE AS INT) funciona muito bem.
Paul Spiegel
57

Para converter campos / valores varchar para o formato numérico, pode ser pouco utilizado:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT`
Jirka Kopřiva
fonte
9
Por que alguém usaria esse "hack" quando existe uma solução direta, documentada, suportada e recomendada?
eggyal
31
@eggyal TL; DR: o "hack" que você está mencionando é uma solução direta, documentada e recomendada. - - - - - - - - - - - - Versão longa : Do manual : To cast a string to a number, you normally need do nothing other than use the string value in numeric contextEmbora eu usasse em +0vez de, *1pois a adição é mais rápida.
Mindwin 24/10/16
8
@BrianStinar, a resposta aceita mostra claramente que existe uma solução com melhor semântica, mas às vezes é conveniente que um valor primitivo seja convertido implicitamente em outra primitiva, especialmente ao combinar cadeias e tipos numéricos. Portanto, basking aleatoriamente linguagens de programação para a existência desse recurso parece bastante inapropriado.
B12Toaster 23/09
Não use esse tipo de hacks! - prática muito ruim que se recuperará muito mais tarde, quando o código estiver cheio desses e difícil de reverter
noites
com esta resposta eu encontrei algumas vezes terminando com um float64 e é por isso que eu prefiro usarCONVERT('123456',UNSIGNED INTEGER)
Yitzchak Weingarten