MySQL 8.4 參考手冊  /  ...  /  位元值文字

11.1.5 位元值文字

位元值文字使用 b'val'0bval 符號撰寫。val 是使用零和一撰寫的二進位值。任何前導 b 的字母大小寫無關緊要。前導 0b 區分大小寫,且不能寫成 0B

合法的位元值文字

b'01'
B'01'
0b01

不合法的位元值文字

b'2'    (2 is not a binary digit)
0B01    (0B must be written as 0b)

預設情況下,位元值文字是二進位字串

mysql> SELECT b'1000001', CHARSET(b'1000001');
+------------+---------------------+
| b'1000001' | CHARSET(b'1000001') |
+------------+---------------------+
| A          | binary              |
+------------+---------------------+
mysql> SELECT 0b1100001, CHARSET(0b1100001);
+-----------+--------------------+
| 0b1100001 | CHARSET(0b1100001) |
+-----------+--------------------+
| a         | binary             |
+-----------+--------------------+

位元值文字可能有一個可選的字元集引介詞和 COLLATE 子句,以將其指定為使用特定字元集和校對的字串

[_charset_name] b'val' [COLLATE collation_name]

範例

SELECT _latin1 b'1000001';
SELECT _utf8mb4 0b1000001 COLLATE utf8mb4_danish_ci;

這些範例使用 b'val' 符號,但 0bval 符號也允許引介詞。有關引介詞的資訊,請參閱第 12.3.8 節「字元集引介詞」

在數值內容中,MySQL 將位元文字視為整數。為確保位元文字的數值處理,請在數值內容中使用它。實現此目的的方法包括加 0 或使用 CAST(... AS UNSIGNED)。例如,預設情況下,指派給使用者定義變數的位元文字是二進位字串。若要將值指派為數字,請在數值內容中使用它

mysql> SET @v1 = b'1100001';
mysql> SET @v2 = b'1100001'+0;
mysql> SET @v3 = CAST(b'1100001' AS UNSIGNED);
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| a    |   97 |   97 |
+------+------+------+

空位元值 (b'') 的評估結果為零長度的二進位字串。轉換為數字時,它會產生 0

mysql> SELECT CHARSET(b''), LENGTH(b'');
+--------------+-------------+
| CHARSET(b'') | LENGTH(b'') |
+--------------+-------------+
| binary       |           0 |
+--------------+-------------+
mysql> SELECT b''+0;
+-------+
| b''+0 |
+-------+
|     0 |
+-------+

位元值符號方便指定要指派給 BIT 資料行的值

mysql> CREATE TABLE t (b BIT(8));
mysql> INSERT INTO t SET b = b'11111111';
mysql> INSERT INTO t SET b = b'1010';
mysql> INSERT INTO t SET b = b'0101';

結果集中的位元值會以二進位值傳回,可能無法正確顯示。若要將位元值轉換為可列印的格式,請在數值內容中使用它,或使用轉換函數,例如 BIN()HEX()。在高階轉換值中不會顯示高階 0 數字。

mysql> SELECT b+0, BIN(b), OCT(b), HEX(b) FROM t;
+------+----------+--------+--------+
| b+0  | BIN(b)   | OCT(b) | HEX(b) |
+------+----------+--------+--------+
|  255 | 11111111 | 377    | FF     |
|   10 | 1010     | 12     | A      |
|    5 | 101      | 5      | 5      |
+------+----------+--------+--------+

對於位元文字,位元運算會被視為數值內容,但在 MySQL 8.4 及更高版本中,位元運算允許數值或二進位字串引數。若要明確指定位元文字的二進位字串內容,請為至少一個引數使用 _binary 引介詞

mysql> SET @v1 = b'000010101' | b'000101010';
mysql> SET @v2 = _binary b'000010101' | _binary b'000101010';
mysql> SELECT HEX(@v1), HEX(@v2);
+----------+----------+
| HEX(@v1) | HEX(@v2) |
+----------+----------+
| 3F       | 003F     |
+----------+----------+

對於這兩個位元運算,顯示的結果看起來相似,但沒有 _binary 的結果是 BIGINT 值,而有 _binary 的結果是二進位字串。由於結果類型不同,顯示的值會有所差異:對於數值結果,不會顯示高階 0 數字。