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.