【问题标题】:Cast int to varchar将 int 转换为 varchar
【发布时间】:2013-02-28 09:50:48
【问题描述】:

我有以下查询,需要将id 转换为varchar

架构

create table t9 (id int, name varchar (55));
insert into t9( id, name)values(2, 'bob');

我尝试了什么

select CAST(id as VARCHAR(50)) as col1 from t9;

select CONVERT(VARCHAR(50),id) as colI1 from t9;

但它们不起作用。请提出建议。

【问题讨论】:

  • 下次一定要包含您看到的实际错误消息。这通常有助于找出问题所在。这次你很幸运,我们中的许多人恰好知道这里发生了什么。

标签: mysql sql database casting mariadb


【解决方案1】:

使用:

SELECT cast(CHAR(50),id) as colI1 from t9;

【讨论】:

    【解决方案2】:

    你得到了这个,因为VARCHAR 不是一个有效的类型。根据 MySQL 文档 (http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast),您只能转换为:

    • 二进制[(N)]
    • CHAR[(N)]
    • 日期
    • 日期时间
    • 十进制[(M[,D])]
    • 签名
    • [整数]
    • 时间
    • 无符号[整数]

    我认为你最好的选择是使用CHAR

    【讨论】:

    • 不确定,因为我使用的是 mysql,但似乎 SQL 允许 varchar stackoverflow.com/a/11989599 尽管您的回答对 mysql 是正确的,谢谢。
    • @Aaron 如果我的字段是 char(1) 但我想将其转换为 enum('m','f') 怎么办??
    【解决方案3】:

    您需要将castconvert 作为CHAR 数据类型,没有可以将数据转换/转换为的varchar 数据类型:

    select CAST(id as CHAR(50)) as col1 
    from t9;
    
    select CONVERT(id, CHAR(50)) as colI1 
    from t9;
    

    SQL Fiddle 上查看以下 SQL 的实际操作:

    /*! Build Schema */
    create table t9 (id INT, name VARCHAR(55));
    insert into t9 (id, name) values (2, 'bob');
    
    /*! SQL Queries */
    select CAST(id as CHAR(50)) as col1 from t9;
    select CONVERT(id, CHAR(50)) as colI1 from t9;
    

    除了您试图转换为不正确的数据类型之外,您用于convert 的语法也不正确。 convert 函数使用以下内容,其中 expr 是您的列或值:

     CONVERT(expr,type)
    

     CONVERT(expr USING transcoding_name)
    

    您的原始查询的语法倒退了。

    【讨论】:

    • 可能值得一提的是,您不必提供长度 - cast 和 convert 都允许 select CAST(id as CHAR) as col1 from t9;
    • @JonathanSayce 不使用长度是不好的做法,我建议阅读Bad habits to kick : declaring VARCHAR without (length) by Aaron Bertrand
    • 有趣的帖子 - 谢谢@bluefeet - 我假设在转换/转换场景中它会使用它需要的大小而不是任意的。
    • @JonathanSayce 我对 MySQL 的来龙去脉并不太熟悉,它可能不会使用任意东西,但我不会依赖 MySQL 引擎那么聪明(无意冒犯 MySQL )。为了确保你得到正确的长度,我总是会明确地提供一个。
    • @Pacerier IMO,使用concat() 进行转换不一定那么直观。我希望我的代码清晰明了,但这并没有多大意义。
    【解决方案4】:

    我没有 MySQL,但有 RDBMS(Postgres 等),您可以在其中使用 hack

    SELECT id || '' FROM some_table;
    

    连接进行隐式转换。

    【讨论】:

    • Postgres 具有清晰简洁的转换,"::data_type"。不在这里使用正确的方式将是一种耻辱。 Mysql 的 concat 或 +0 虽然是合理的
    【解决方案5】:

    是的

    SELECT id || '' FROM some_table;
    or SELECT id::text FROM some_table;
    

    是 postgresql,但 mySql 不允许这样做!

    mySql 中的捷径:

    SELECT concat(id, '') FROM some_table;
    

    【讨论】:

    • 嘿,从 some_table 中选择 concat(id, '');是 MySQL 的一个很好的 hack,谢谢!
    • 是的,就是这样
    【解决方案6】:

    我解决了一个比较整数列 x a varchar 列与

    的问题

    where CAST(Column_name AS CHAR CHARACTER SET latin1 ) collate latin1_general_ci = varchar_column_name

    【讨论】:

      【解决方案7】:

      我将笼统地回答这个问题,非常感谢上述贡献者。
      我在 MySQL Workbench 上使用 MySQL。我在尝试使用GROUP_CONCAT 方法将charint 连接在一起时遇到了类似的问题。 总之,对我有用的是:

      假设您的 char 是 'c' 而int 是 'i',那么查询变为:
      ...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...

      【讨论】:

        【解决方案8】:

        应该也可以做这样的事情:

        Select (id :> VARCHAR(10)) as converted__id_int
        from t9 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-27
          • 2017-12-11
          • 2013-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多