位元值字面值使用 b'
或 val
'0b
符號寫入。val
val
是使用 0 和 1 寫入的二進位值。任何開頭 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
'0b
符號也允許引導符。如需引導符的相關資訊,請參閱 章節 12.3.8,「字元集引導符」。val
在數值內容中,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 9.0 及更高版本中使用數值或二進位字串引數。若要明確指定位元字面值的二進位字串內容,請至少為其中一個引數使用 _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 數字不會顯示在數值結果中。