更新时间:2025-06-30 GMT+08:00

二进制数据类型

表1 二进制数据类型

数据类型

与MySQL的差异

BINARY[(M)]

  • 输入格式:
    • 插入字符串长度小于目标长度时,GaussDB填充符是0x20,MySQL是0x00。
  • 字符集:默认字符集为数据库初始化字符集,MySQL默认类型字符集为BINARY字符集。
  • 输出格式:
    • JDBC协议输出时BINARY类型的末尾空格显示为空格,MySQL末尾空格显示为\x00。
    • 宽松模式下, BINARY类型面对输入超过n的字节数的字符输入(例如中文字符), 会将超限的整个字符截断。MySQL中会将超限的整个字符的前几位满足n范围内的字节信息保留,但输出时字符信息显示乱码。
其余差异请参见表格下方说明中的内容。
说明:

GaussDB中,由于BINARY类型填充符与MySQL的差异,在操作符比较计算,字符串相关系统函数计算,索引匹配,数据导入导出等场景下与MySQL的表现会存在差异。具体差异场景请参见本章节示例。

VARBINARY(M)

字符集:默认字符集为数据库初始化字符集,MySQL默认类型字符集为BINARY字符集。

其余差异请参见表格下方说明中的内容。

TINYBLOB

具体差异请参见表格下方说明中的内容。

BLOB

具体差异请参见表格下方说明中的内容。

MEDIUMBLOB

具体差异请参见表格下方说明中的内容。

LONGBLOB

取值范围:只支持最大1GB-512字节长度,MySQL最大支持4GB-1字节长度。

BIT[(M)]

输出格式:

  • GaussDB中会以二进制字符串形式输出,MySQL 5.7中根据ASCII码表转义,无法转义的输出无法显示的字符串。MySQL 8.0 中统一输出0x形式的十六进制结果。
  • 在MySQL 8.0以上版本,默认会开头补0,GaussDB不会补0。

其余差异请参见表格下方说明中的内容。

  • 对于无法转义的二进制或十六进制字符串,MySQL 5.7会输出无法显示的字符串, MySQL 8.0输出格式为0x形式的十六进制结果,GaussDB输出格式为多个\x的十六进制结果。
  • 对于TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB类型:
    • MySQL中不允许设置默认值,GaussDB中创建表列时语法上允许设置默认值。
    • 主键:MySQL中不支持主键,GaussDB支持。
    • 索引:MySQL中不支持除前缀索引外其他索引方法,GaussDB支持。
    • 外键:MySQL中不支持作为外键的参考列/被参考列,GaussDB支持。

示例:

-- GaussDB
m_db=# CREATE TABLE test_blob(a blob);
CREATE TABLE

m_db=# INSERT INTO test_blob VALUES(0x1);
INSERT 0 1

m_db=# INSERT INTO test_blob VALUES(0x111111);
INSERT 0 1

m_db=# INSERT INTO test_blob VALUES(0x61);
INSERT 0 1

m_db=# SELECT * FROM test_blob;
      a       
--------------
 \x01
 \x11\x11\x11
 a
(3 rows)

m_db=# DROP TABLE test_blob;
DROP TABLE

-- MySQL 5.7
mysql> CREATE TABLE test_blob(a blob);
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO test_blob VALUES(0x1);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO test_blob VALUES(0x111111);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO test_blob VALUES(0x61);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM test_blob;
+------+
| a    |
+------+
|     |
|   |
| a    |
+------+
3 rows in set (0.00 sec)

mysql> DROP TABLE test_blob;
Query OK, 0 rows affected (0.00 sec)

-- MySQL 8.0
mysql> CREATE TABLE test_blob(a blob);
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO test_blob VALUES(0x1);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO test_blob VALUES(0x111111);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO test_blob VALUES(0x61);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM test_blob;
+------------+
| a          |
+------------+
| 0x01       |
| 0x111111   |
| 0x61       |
+------------+
3 rows in set (0.00 sec)

mysql> DROP TABLE test_blob;
Query OK, 0 rows affected (0.04 sec)