更新时间:2024-12-04 GMT+08:00
分享

二进制数据类型

表1 二进制数据类型

MySQL数据库

GaussDB数据库

差异

BINARY[(M)]

支持,存在差异

  • 输入格式:
    • 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。
    • 插入字符串长度小于目标长度时,GaussDB填充符是0x20,MySQL是0x00。
  • 字符集:默认字符集为数据库初始化字符集,MySQL默认类型字符集为BINARY字符集。
  • 输出格式:
    • JDBC协议输出时BINARY类型的末尾空格显示为空格,MySQL末尾空格显示为\x00。
    • 宽松模式下, BINARY类型面对输入超过n的字节数的字符输入(例如中文字符), 会将超限的整个字符截断。MySQL中会将超限的整个字符的前几位满足n范围内的字节信息保留,但输出时字符信息显示乱码。
    • 在MySQL 8.0以上版本,默认以0x开头形式返回,GaussDB以多个\x形式返回。
    说明:

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

VARBINARY(M)

支持,存在差异

  • 输入格式:输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。
  • 字符集:默认字符集为数据库初始化字符集,MySQL默认类型字符集为BINARY字符集。
  • 输出格式:
    • JDBC协议输出时BINARY类型的末尾空格显示为空格,MySQL末尾空格显示为\x00。
    • 在MySQL 8.0以上版本,默认以0x开头形式返回,GaussDB以多个\x形式返回。

TINYBLOB

支持,存在差异

  • 输入格式:
    • 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。
    • 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。
  • 主键:MySQL中TINYBLOB类型不支持主键,GaussDB支持。
  • 索引:MySQL中TINYBLOB类型不支持除前缀索引外其他索引方法,GaussDB支持。
  • 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。
  • 输出格式:在MySQL 8.0以上版本,默认以0x开头形式返回,GaussDB以多个\x形式返回。

BLOB

支持,存在差异

  • 输入格式:
    • 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。
    • 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。
  • 主键:MySQL中BLOB类型不支持主键,GaussDB支持。
  • 索引:MySQL中BLOB类型不支持除前缀索引外其他索引方法,GaussDB支持。
  • 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。
  • 输出格式:在MySQL 8.0以上版本,默认以0x开头形式返回,GaussDB以多个\x形式返回。

MEDIUMBLOB

支持,存在差异

  • 输入格式:
    • 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。
    • 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。
  • 主键:MySQL中MEDIUMBLOB类型不支持主键,GaussDB支持。
  • 索引:MySQL中MEDIUMBLOB类型不支持除前缀索引外其他索引方法,GaussDB支持。
  • 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。
  • 输出格式:在MySQL 8.0以上版本,默认以0x开头形式返回,GaussDB以多个\x形式返回。

LONGBLOB

支持,存在差异

  • 取值范围:只支持不超过1G字节长度,MySQL支持4G-1字节长度。
  • 输入格式:
    • 默认值:创建表列时语法上允许设置默认值,MySQL不允许设置默认值。
    • 输入二进制或十六进制字符串时,GaussDB输出为十六进制,MySQL中根据ASCII码表转义,无法转义的输出为空。
  • 主键:MySQL中LONGBLOB类型不支持主键,GaussDB支持。
  • 索引:MySQL中LONGBLOB类型不支持除前缀索引外其他索引方法,GaussDB支持。
  • 外键:MySQL中TINYTEXT类型不支持作为外键的参考列/被参考列,GaussDB支持。
  • 输出格式:在MySQL 8.0以上版本,默认以0x开头形式返回,GaussDB以多个\x形式返回。

BIT[(M)]

支持,存在差异

输出格式:
  • 所有输出按照二进制字符串形式输出。MySQL中根据ASCII码表转义,无法转义的输出为空。
  • 在MySQL 8.0以上版本,默认会开头补0,GaussDB不会补0。

示例:

-- GaussDB场景
m_db=# CREATE TABLE test(a BINARY(10)) DISTRIBUTE BY REPLICATION;
CREATE TABLE
m_db=# INSERT INTO test VALUES(0x8000);
INSERT 0 1
m_db=# SELECT hex(a) FROM test;
         hex
----------------------
 80202020202020202020
(1 row)

m_db=# SELECT * FROM test WHERE hex(a) = 80000000000000000000;
 a
---
(0 rows)

m_db=# CREATE TABLE test2(a BINARY(10)) DISTRIBUTE BY REPLICATION;
CREATE TABLE
m_db=# INSERT INTO test2 VALUES(0x80008000);
INSERT 0 1
m_db=# SELECT hex(a) FROM test2;
         hex
----------------------
 80202020202020202020
(1 row)

m_db=# DROP TABLE test;
DROP TABLE
m_db=# DROP TABLE test2;
DROP TABLE

-- MySQL场景
mysql> CREATE TABLE test(a BINARY(10));
Query OK, 0 rows affected (0.01 sec)

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

mysql> SELECT hex(a) FROM test;
+----------------------+
| hex(a)               |
+----------------------+
| 80000000000000000000 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM test WHERE hex(a) = 80000000000000000000;
+------------+
| a          |
+------------+
| ▒           |
+------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE test2(a binary(10));
Query OK, 0 rows affected (0.00 sec)

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

mysql> SELECT hex(a) FROM test2;
+----------------------+
| hex(a)               |
+----------------------+
| 80008000000000000000 |
+----------------------+
1 row in set (0.00 sec)
mysql> DROP TABLE test;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE test2;
Query OK, 0 rows affected (0.00 sec)

相关文档