如何在MySQL 5.1中将整数转换为位(bit)?

13

我正在从SQL Server过渡到MySQL 5.1,似乎在尝试使用select语句创建包含位字段的表时遇到了问题。

理想情况下,以下语句应该有效:

CREATE TABLE myNewTable AS
SELECT cast(myIntThatIsZeroOrOne as bit) AS myBit
FROM myOldtable

然而,将int列强制转换为bit时,SQL非常不满意。我该如何告诉它将一列int(我知道只有0和1)选择为bit?


为什么你需要将它转换为位(bit)?不能使用[TINY]INT吗?根据手册,无法将其转换为BIT。 - Mchl
3个回答

19

无法这样做!

CAST 和 CONVERT 只适用于以下类型:

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

没有空间容纳:BIT、BITINT、TINYINT、MEDIUMINT、BIGINT、SMALLINT 等等……

但是,您可以创建自己的函数 cast_to_bit(n):

DELIMITER $$

CREATE FUNCTION cast_to_bit (N INT) RETURNS bit(1)
BEGIN
    RETURN N;
END

如果您想自己尝试,可以创建一个带有多个转换的视图,例如:

CREATE VIEW view_bit AS
    SELECT
        cast_to_bit(0),
        cast_to_bit(1),
        cast_to_bit(FALSE),
        cast_to_bit(TRUE),
        cast_to_bit(b'0'),
        cast_to_bit(b'1'),
        cast_to_bit(2=3),
        cast_to_bit(2=2)

...然后描述它!

DESCRIBE view_bit;

塔达!!现在每个人都有点兴奋啦!!!


5
尝试使用CONV(N, from_base, to_base)函数。
此函数可在不同进位之间转换数字。将数字N从from_base进制转换为to_base进制,并返回其字符串表示形式。如果有任何一个参数为空,则返回NULL。参数N被解释为整数,但可以指定为整数或字符串。最小进制为2,最大进制为36。如果to_base是负数,则N被视为有符号数。否则,N被视为无符号数。CONV()函数具有64位精度。
例如:
select CONV(9, 10, 2);

一个比特可以是零或一,没有基本表示。我认为你把它和字节混淆了。 - kurast
BIT列的基本表示是2。BIT(n)是一系列最多包含(n)个1位数字,可以是零或一。因此,您可以将其转换为基数2,但我认为这不起作用,因为结果似乎是一个INT。 - Ber

4

尝试使用 case:

CREATE TABLE myNewTable AS
SELECT (case myIntThatIsZeroOrOne when 1 then true else false end) AS myBit
FROM myOldtable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接