Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL 5.5:当我使用;CONV";关于位数据类型_Mysql_Casting_Base - Fatal编程技术网

MySQL 5.5:当我使用;CONV";关于位数据类型

MySQL 5.5:当我使用;CONV";关于位数据类型,mysql,casting,base,Mysql,Casting,Base,为了理解MYSQL的BIT,我在MYSQL中创建了一个表名BIT\u demo,并在其中添加了几行,如下所示: mysql> CREATE TABLE `bit_demo` ( -> `mybit` bit(10) NOT NULL DEFAULT b'0' -> ); Query OK, 0 rows affected (0.05 sec) mysql> insert into bit_demo values(b'1111111111'); Query

为了理解MYSQL的
BIT
,我在MYSQL中创建了一个表名
BIT\u demo
,并在其中添加了几行,如下所示:

mysql> CREATE TABLE `bit_demo` (
    -> `mybit` bit(10) NOT NULL DEFAULT b'0'
   -> );
Query OK, 0 rows affected (0.05 sec)

mysql> insert into bit_demo values(b'1111111111');
Query OK, 1 row affected (0.00 sec)

mysql> insert into bit_demo values(b'0');
Query OK, 1 row affected (0.00 sec)

mysql> insert into bit_demo values(b'1');
Query OK, 1 row affected (0.00 sec)
但是当我使用普通的
SELECT
查询时,屏幕上显示了一些奇怪的字符:

mysql> select mybit from bit_demo;
+-------+
| mybit |
+-------+
| ♥     |
|       |
|  ☺    |
+-------+
3 rows in set (0.00 sec)
因此,我尝试在MySQL中使用
CONV(value,from_base,to_base)
在输入它们时以位的形式查看它们。因为我不知道基础的哪个值有效,所以我尝试了不同的值。令我惊讶的是,在这种情况下,
from_base
2
36
之间的任何值都有效。

从\u base
到\u base
的成功结果是
2
10
36

mysql> select conv(mybit,2,2) mybit from bit_demo;
+------------+
| mybit      |
+------------+
| 1111111111 |
| 0          |
| 1          |
+------------+
3 rows in set (0.00 sec)

mysql> select conv(mybit,2,36) mybit from bit_demo;
+-------+
| mybit |
+-------+
| SF    |
| 0     |
| 1     |
+-------+
3 rows in set (0.00 sec)

mysql> select conv(mybit,36,2) mybit from bit_demo;
+------------+
| mybit      |
+------------+
| 1111111111 |
| 0          |
| 1          |
+------------+
3 rows in set (0.00 sec)

mysql> select conv(mybit,10,2) mybit from bit_demo;
+------------+
| mybit      |
+------------+
| 1111111111 |
| 0          |
| 1          |
+------------+
3 rows in set (0.00 sec)

mysql> select conv(mybit,36,36) mybit from bit_demo;
+-------+
| mybit |
+-------+
| SF    |
| 0     |
| 1     |
+-------+
3 rows in set (0.00 sec)

mysql> select conv(mybit,10,10) mybit from bit_demo;
+-------+
| mybit |
+-------+
| 1023  |
| 0     |
| 1     |
+-------+
3 rows in set (0.00 sec)
正如您在上面所看到的,当
from_base
2
36
之间变化时,结果不会改变。但当
介于
2
36
之间时,它会发生变化。
我还使用了
CAST(值为UNSIGNED)
,它的工作原理类似于
CONV(值,10)

from_base
中的任何值在
BIT
上与
CONV
一起工作时,解释是什么?

TL;博士 以上所有问题和疑问的答案是:因为它是
BIT
数据类型,所以它存储BIT。位正是任何存储中的任何数据。因此,你不能仅仅从它们的表现上看它们。比特只是内容,它们的“形状”取决于上下文

位实际上是什么? 一些定义

正如中所述,它将值存储为普通位。这是什么意思?这意味着:数据存储为位序列,没有关于存储哪种数据的信息。DBMS根本不关心数据的类型——没有这方面的定义,“
”不应该让您感到困惑。“
BIT
”并没有指向任何实际的数据类型,但它声称其中的数据只不过是位序列

什么是“位序列”

存储位序列意味着该序列的真正意义将取决于上下文。如果不指向上下文,就无法真正说出特定序列的含义。例如,整数和字符串。什么是整数?它是一个以位序列形式存储的数字。什么是弦?是。。位序列也是。那么如何区分它们呢?这就是为什么我们有数据类型。每种类型都是一种结构,它决定了如何处理特定的值,而该值始终是位序列

现在,“
BIT
数据类型”的命名非常糟糕,因为实际上根本没有“数据类型”。它只是告诉用户它存储数据,而不绑定数据的含义。让我们用一些例子来说明。比方说,我们要存储字符串
“s”
。如何解释??使用位序列,我们可以恢复其“内部”视图:

现在我们知道了“数字”表示法。下一步:

mysql> SELECT CONV(115, 10, 2);
+------------------+
| CONV(115, 10, 2) |
+------------------+
| 1110011          |
+------------------+
1 row in set (0.01 sec)
好的,这是我们想要的。我引用“比特”是因为它只是可视化的,不是真实的数据。最后,我们可以将其作为位文本插入:

mysql> INSERT INTO bit_demo (mybit) VALUES (b'1110011');
Query OK, 1 row affected (0.02 sec)
现在,一些“魔法”:

塔达!正如您所看到的,我没有进行任何转换,但是我可以在屏幕上看到有效的
“s”
字符串。为什么?因为当您“选择”某个内容时,MySQL客户端会显示该内容,并将传入数据解释为字符串。所以这就是为什么“它起作用了”——我们只编写了可能被解释为
“s”
——而且,由于客户机正在尝试这样做(所以,将传入的数据解释为字符串),所以一切都很顺利,我们看到了字符串

字符串的更多信息:编码

现在,字符串是一个很好的示例,因为它们也有如何解释符号的问题,因为。符号只是一个位序列,当显示符号时,您在屏幕上看到的只是所选编码的相应图形形状。举例说明:

mysql> insert into bit_demo values(b'0111111111');
Query OK, 1 row affected (0.02 sec)
让它成为我们的价值,现在,第一种情况:

mysql> SET NAMES UTF8;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from bit_demo;
+-------+
| mybit |
+-------+
| �    |
+-------+
1 row in set (0.00 sec)
第二种情况:

mysql> SET NAMES cp1251;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from bit_demo;
+-------+
| mybit |
+-------+
| я    |
+-------+
1 row in set (0.00 sec)
如您所见,某些“符号”的实际含义取决于我们使用的编码。位只是值,不知道这些值的含义

整数运算

现在,这与
CONV()
的问题大致相同。传递给该函数的值将被解释为整数值。没有给出诸如“基数”之类的信息,更重要的是,它不适用于这里-您的位只存储值,对于任何基数都是相同的,因此,您将“从”转换为什么基数无关紧要-位中的值不会改变。这就是为什么对于任意输入基数(因此,
2..36
),如果目标基数相同,您将看到相同的转换结果

以位表示的值,当用作整数时,立即成为“整数”类型,但它们也将成为由这些数据类型定义的值。再次,让我们举例说明(对于这个示例,我使用64位长度):

让我们看看“什么”是什么:

以及:

差别很大,对吧?同样,这是因为对于某些数据类型,我们定义了存储值的规则,但值本身不知道如何使用和表示它

结论 您可以将“
BIT
数据类型”视为“无类型”值。因为它实际上没有指定关于值的含义的任何信息,所以它只存储该值。如何使用它以及如何解释它只是另一回事。您应该记住,当使用此类型以及任何值时,不管它是什么以及它在哪里,最终都只是位序列

mysql> insert into bit_demo values(b'0111111111');
Query OK, 1 row affected (0.02 sec)
mysql> SET NAMES UTF8;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from bit_demo;
+-------+
| mybit |
+-------+
| �    |
+-------+
1 row in set (0.00 sec)
mysql> SET NAMES cp1251;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from bit_demo;
+-------+
| mybit |
+-------+
| я    |
+-------+
1 row in set (0.00 sec)
mysql> INSERT INTO bit_demo VALUES (b'1111111111111111111111111111111111111111111111111111111111111101');
Query OK, 1 row affected (0.07 sec)
mysql> SELECT CAST(mybit AS SIGNED) FROM bit_demo;
+-----------------------+
| CAST(mybit AS SIGNED) |
+-----------------------+
|                    -3 |
+-----------------------+
1 row in set (0.00 sec)
mysql> SELECT CAST(mybit AS UNSIGNED) FROM bit_demo;
+-------------------------+
| CAST(mybit AS UNSIGNED) |
+-------------------------+
|    18446744073709551613 |
+-------------------------+
1 row in set (0.00 sec)