从VARCHAR转换为INT - MySQL

Len*_*ran 244 mysql sql

我目前的数据

SELECT PROD_CODE FROM `PRODUCT`
Run Code Online (Sandbox Code Playgroud)

PROD_CODE
2
5
7
8
22
10
9
11
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有四个查询,但都没有工作.(参考)

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;
Run Code Online (Sandbox Code Playgroud)

所有抛出语法错误,如下所示:

您的SQL语法有错误; 查看与您的MySQL服务器版本对应的手册,以便在'1'的AS INT FROM PRODUCT LIMIT 0,30'附近使用正确的语法

您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的'INTEGER)FROM PRODUCT LIMIT 0,30'附近使用正确的语法

在MySQL中将varchar强制转换为整数的正确语法是什么?

MySQL版本:5.5.16

egg*_*yal 515

Cast Cast和Operators中所述:

结果的类型可以是以下值之一:

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

因此,您应该使用:

SELECT CAST(PROD_CODE AS UNSIGNED) FROM PRODUCT
Run Code Online (Sandbox Code Playgroud)

  • @emaillenin:强制转换的数据类型与列的数据类型不同,因为需要有关如何解释数据的附加信息,例如整数是否已签名. (19认同)
  • 感谢您提供此信息.MySQL文档对我来说很混乱,所以这对我有很大的帮助. (12认同)
  • 无符号正在工作.从什么时候开始MySQL将Integer数据类型更改为Unsigned? (5认同)
  • @bsplosion:我不同意。至少自 2014 年以来,一直有[开放功能请求](https://bugs.mysql.com/bug.php?id=73054) 将“AS INT”视为“AS SIGNED”。 (3认同)
  • 请注意,在 MariaDB `CAST(PROD_CODE AS INT)` [works](https://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=788d34d534bea6be08e605c9343ab4ce) 上就很好了。 (2认同)

Jir*_*iva 52

对于将varchar字段/值转换为数字格式,可以使用少量hack:

SELECT (`PROD_CODE` * 1) AS `PROD_CODE` FROM PRODUCT`
Run Code Online (Sandbox Code Playgroud)

  • @eggyal**TL; DR:**你提到的"hack",是一个简单,有文档和推荐的解决方案. - - - - - - - - - - - - - **长版本**:来自[手册](http://dev.mysql.com/doc/refman/5.7/en/cast-functions.html) :`要将字符串转换为数字,除了在数字上下文中使用字符串值之外,通常只需要做什么.虽然我使用`+ 0`而不是`*1`,因为加法更快. (27认同)
  • 当有简单,文档化,支持和推荐的解决方案时,为什么会使用这样的"黑客"呢? (8认同)
  • @BrianStinar接受的答案清楚地表明存在一个具有更好语义的解决方案,但有时将原始值隐式地转换为另一个原语是很方便的,特别是在组合字符串和数字类型时.因此,随机抨击编程语言对于此功能的存在似乎是不合适的. (6认同)
  • 这就是“推荐的解决方案”,为什么MySQL可以与Apache和PHP完美结合。 (2认同)
  • 有了这个答案,我发现有时会以 float64 结束,这就是为什么我更喜欢使用“CONVERT('123456',UNSIGNED INTEGER)” (2认同)