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


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

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`

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.