Klustron(KunlunBase) 的 MySQL 连接协议简介
Klustron(KunlunBase) 的 MySQL 连接协议简介
前言
Klustron 的计算节点基于 PostgreSQL 研发,因而直接可以支持 PostgreSQL 的连接协议和SQL语法,所以使用 JDBC,ODBC 等通用的数据库连接协议以及使用各类编程语言的 PostgreSQL 专有的连接库的软件都可以连接到 Klustron 集群并且正常工作。
为了让原本使用 MySQL 的应用程序可以不需要修改也不需要重新编译就能连接并且正常使用 Klustron ,我们开发了 Klustron 的MySQL 连接协议,本文对此协议实现做一个简介。
总的来说,对于 Klustron 来说,连接协议就是客户端与 Klustron 服务器通信的管道,MySQL 和 PostgreSQL 协议就像两种形状不同的管道,而其中传输的 SQL 语句和查询结果则本质上是相同的。
也就是说Klustron 支持的任何 SQL 语法和功能都可以在 MySQL 和 PostgreSQL 这两种连接协议中的任何一种连接中传输到服务器集群中正常执行并收到其结果。
例如可以在 MySQL 连接中发送 PostgreSQL 私有语法 SQL 或者标准 SQL 语句,包括 prepared statement 语法,存储过程语法,DDL 语法等,并且得到遵循 MySQL 协议的结果,从而可以使用 MySQL 客户端库完成结果读取;也可以 在PostgreSQL 连接中发送 Klustron 支持的任何 MySQL 私有语法(例如 prepared statement,DML 等)的 SQL 语句或者标准 SQL 语句,并且得到遵循 PostgreSQL 的结果,从而可以使用 PostgreSQL 客户端库完成结果读取。
Klustron MySQL 连接协议概况
- 支持 text 协议和 binary 协议
- 支持 prepared statement (binary 协议)
- 不支持MySQL 语法的 EXECUTE 语句,支持 PostgreSQL的语法的EXECUTE语句
- 支持 10 多年广泛使用的 mysql 认证方式 mysql_native_password
- 支持所有主要编程语言的 mysql client 库
- c/c++/c#/go/java/php/python/rust/ruby/.net
- 支持 MySQL 所有私有数据类型和私有运算符
- 支持 MySQL 所有私有DML语法
- 支持 MySQL 变量读写语法
- 支持常用命令,包括:
- USE
- KILL CONNECTION/QUERY
- SHOW系列命令
- 支持 MySQL 的 autoincrement 关键字和功能
- 支持 autocommit 和事务隐式开始&隐式提交
- 与 MySQL 完全相同的错误号
- 错误描述字符串与 MySQL 大意相同,文本不完全相同
- 兼容 MySQL UTF8 /GBK/latinN/ascii 等常用字符集
- 支持 MySQL 的数据压缩算法
- zlib & zstd
- 支持所有有用的 MySQL 命令类型
- COM_CHANGE_USER(mysql_change_user())
- COM_INIT_DB(mysql_select_db())
- 暂不支持 SSL,未来会支持
- 支持MySQL引号规则(`,',")
- 从klustron-1.2开始,支持MySQL常用DDL语法
Klustron MySQL 协议支持的功能
Klustron & MySQL 协议支持所有常用功能,包括文本和二进制协议,连接验证(只支持 mysql_native_password ),数据压缩,prepared statement,字符集,错误处理,SSL 连接等。
一个 Klustron-server(计算节点)同时监听 2 个TCP端口 --- PostgreSQL 协议的端口(默认 5432 )和 MySQL 协议的端口(默认 5306 ),都可以通过配置文件自定义配置。
MySQL 和 PostgreSQL 客户端使用统一的用户名和密码连接 Klustron-server,不论使用哪一种连接协议。Klustron-server 收到 TCP 连接请求后,会启动本端口的服务端协议(即 PostgreSQL 或者 MySQL )处理模块,完成连接验证,建立起有效的数据库连接。后续在这两类连接中用户可以发送的 SQL 语句完全相同,与协议无关。用户可以在任何一类连接中发送标准 SQL 语句,或者 PostgreSQL 或者 MySQL 私有语法的 SQL 语句给 Klustron 并且获得结果。
账号和访问控制
用户通过 Klustron-server 的 PostgreSQL 或者 MySQL 连接发送 create user 语句建立用户账户,这里的 create user 语法(以及任何其他 DDL 语法)必须是 PostgreSQL 的语法。DBA 通过在 pg_hba.conf 配置文件中建立访问控制规则,来可选地定义某些用户账号必须来自特定的 IP 或者域名,或者某个账户只能访问某些database等访问控制规则。关于在 pg_hba.conf 配置访问控制规则,详见 PostgreSQL 的文档。
错误处理
Klustron 的MySQL 协议会自动把 PostgreSQL 的错误号被映射到对应的 MySQL 错误号;MySQL 协议运行期间返回的错误则使用与MySQL 的 server 端协议实现完全相同的错误号。因此应用程序原本处理 MySQL 错误的代码逻辑不需要任何修改就可以按照预期工作。 JDBC 等数据库客户端 API 库基于异常类树进行错误处理,每一个异常类型绑定若干个 MySQL 错误号,因此只要应用程序代码实现了异常捕捉,也可以正确地捕获 Klustron 的 MySQL 连接返回的错误异常。
错误描述文本使用 PostgreSQL 的错误字符串,而不是 MySQL 错误号对应的文本。这通常不会成为问题,因为根据 MySQL 的文档,虽然错误号码在所有 MySQL 版本中不变,但是错误描述并不承诺不变,所以应用程序本来也不应该基于错误字符串的内容匹配来实现其功能逻辑。
另外,Klustron 支持 mysql 的 SHOW WARNINGS 和 SHOW ERRORS 语句,并且其用法和效果与 MySQL 的相同语句完全相同。
字符集
MySQL 客户端可以按照其标准方式指定字符集,这个字符集如果 Klustron 不支持则连接失败报错。PostgreSQL 默认支持丰富的字符集,它与 MySQL 支持的字符集大部分是重合的,所有常见字符集两者都支持,包括 所有中文、日韩字符集以及主要欧洲(西中东欧)各语言字符集。MySQL 客户端发送到 Klustron 的任何字符串,都会先转换为当前数据库的字符集再使用;返回给 MySQL 客户端的任何字符串都会先从当前数据库的字符集转回 MySQL 客户端字符集再发送。
不支持 mysql的set client/connection/server_character_set/collation, 但是支持 SET NAMES 语法。
数据压缩
支持使用 zlib 和 zstd 在传输数据包之前压缩。
Klustron & MySQL 连接协议不支持的 MySQL 功能
- 只支持 mysql_native_password 一种认证方法,不支持其他认证方法或者外部认证插件。这对于自 mysql-4.1 以来的各个版本的 MySQL 客户端都是没问题的,它们都可以正确地连接上来并正常工作。
- 所有的密码管理功能 包括密码过期,密码验证,双密码,密码重用限制,多次密码错误导致账户临时锁定等。所有此类功能都使用PostgreSQL原有的功能。
- 账户管理的不常用功能 代理用户( proxy user ),未知、匿名用户、账户锁定,账户资源限制。
- 使用 text 协议发送 prepared statement 生产系统中应该使用 binary 连接执行 prepared statement,这才是其设计初衷,也是 Klustron 的 MySQL 协议支持的。 text 协议执行 prepare/execute 命令无论对于 MySQL 还是 PostgreSQL 都仅仅是用于开发和调试,而 Klustron 并不支持 mysql的 prepare/execute 语法,并且没有 MySQL 的用户自定义变量这个功能,也就无法按照 mysql prepare statement 的方式绑定参数。
- init_connect 语句初始化连接状态 该功能知道的用户很少,而且在连接 初始化好之前执行 SQL 语句本来也不符合数据库系统的设计原理,因此在 Klustron 中不支持。
- session state tracking 因为 mysqld 维护的那些 status 变量,在 Klustron 的计算节点中并不存在。因此也不支持 mysql_session_track_xxx 系列客户端API 函数。 但是同时,Klustron 继承了 PostgreSQL 的pgstat 基础设施,pgstat 可以收集非常丰富的系统运行时统计信息,MySQL 和 PostgreSQL 客户端都可以通过查询 pgstat 的一系列视图和函数,可以得到这些信息。详见 PostgreSQL 的 pgstat 文档。
Klustron MySQL服务端协议与 MySQL 服务端协议不同的功能
1. 连接的目标数据库
当 mysql 客户端连接 Klustron 计算节点时没有指定数据库名称,那么默认连接到 “postgres” 数据库,这一点与 MySQL 的行为是不同的 --- MySQL 在这种情况下不指定当前数据库。同时,MySQL 支持使用 use db 语句或者使用 mysql_select_db() 客户端 API 来切换当前数据库,但是 postgres 并不允许在一个活跃连接中切换数据库,详见下文。
从Klustron-1.1版本开始,在Klustron的 MySQL连接中,transform_create_db_to_schema 配置参数为on(默认是on) 时, 用户执行CREATE/DROP DATABASE 或者 SHOW DATABASES 相当于执行了CREATE/DROP SCHEMA 或者 SHOW SCHEMAS语句。这是为了默认的MySQL兼容性。这样的话,Klustron的MySQL连接中,用户就可以执行USE 语句或者调用mysql_select_db() 函数来切换当前数据库,达到在MySQL中相同的效果。
2. 数据输出格式
对于所有数据类型,Klustron 都使用 PostgreSQL 的输出函数来生成文本协议下的查询结果,这意味着 decimal/numeric, float, real(double), date, timestamp, timestamptz, time 类型的输出结果在个别情况下可能会与 MySQL 的输出的字段值文本表示有细微差别 --- 由于数值类型是因为序列化的浮点数精度差异;日期时间类型是因为 locale 设置或者时区信息,例如 postgreSQL 的 timestamptz 类型字段值总是带有时区值,例如 ”2022-5-30 21:08:35+08” 。 如果使用 binary 协议(也就是使用 prepared statement,bind 参数和结果),则没有这些差别。
Klustron 支持的 MySQL 命令
在 Klustron 的 MySQL 连接中,MySQL 客户端软件除了可以发送 SQL 语句(即 COM_QUERY 命令)之外,还可以发送若干种其他命令,具体包括:
- 改变连接状态的命令及其对应的 MySQL 客户端 API :
COM_SET_OPTION:mysql_set_server_option()
COM_RESET_CONNECTION: mysql_reset_connection()
COM_PING:mysql_ping()
COM_QUIT: mysql_close()
- Prepared statement 相关的所有命令
COM_STMT_EXECUTE
COM_STMT_FETCH
COM_STMT_PREPARE
COM_STMT_SEND_LONG_DATA
COM_STMT_RESET
COM_STMT_CLOSE
- 其他命令
包括 COM_INIT_DB 和COM_CHANGE_USER 命令,下文详述这两个命令。
上述每一种命令都对应这MySQL connector 库中的一个函数,也就是说,这些函数都是用户可以调用的。
Klustron 不支持的 MySQL 命令
Klustron 不支持的 MySQL 命令包括所有 deprecated(过时的,即将在未来版本去除)的命令,replication 和 clone 相关的命令,以及 mysql server 内部使用的(客户端不可以使用的)命令。如果应用程序调用 mysql 客户端 API 执行下列不支持的命令,则 Klustron 计算节点会返回标准的 MySQL 错误 1047 (不支持的命令)。
昆仑数据库不支持的 MySQL 命令如下:
COM_PROCESS_KILL:mysql_kill() 已过时,可以使用kill connection/query,而且Klustron 库目前支持此命令
COM_PROCESS_INFO: mysql_list_processes() 已过时,可以使用show processlist,而且Klustron 目前支持此命令
COM_BINLOG_DUMP_GTID:replication命令,备节点IO线程连接主节点时使用
COM_BINLOG_DUMP:replication命令,备节点IO线程连接主节点时使用
COM_REFRESH:更新用户账户和访问控制信息。Klustron 不需要用户显示地刷新缓存,而是完全自动的探测到任何元数据表发生变化并且自动更新缓存的对应信息。不支持此命令或者对应的mysql_reload(), mysql_refresh()函数
COM_STATISTICS:Klustron 中统计信息使用pgstat的设施获得,不支持mysql_stat() API 函数或者mysqladmin获取统计信息
COM_DEBUG:mysql_debug() 函数,仅在开发人员调试时使用,生产系统中无法使用。
COM_REGISTER_SLAVE:replication命令,备节点IO线程连接主节点时使用
COM_CLONE:clone命令
COM_FIELD_LIST:mysql_list_fields()已过时,使用show columns,不过Klustron 目前不支持此命令,用户需要查询pg_attribute等元数据表获得列的元数据
COM_SLEEP:不是客户端发送的,内部使用
COM_CONNECT:连接建立后就不可以发送此命令
COM_TIME:不是客户端发送的,内部使用
COM_DELAYED_INSERT:在mysql中已去除
COM_END:不是客户端发送的,内部使用
不支持mysql_set_local_infile_xxx()系列函数
切换会话当前数据库和用户命令
- COM_INIT_DB
在 MySQL 连接中切换当前(默认)database,也即是 use db 语句的命令版本。在 Klustron 中不支持用这两种方式切换 database,但是可以用 USE命令和mysql_select_db() 这个client API来切换当前(默认) schema。
PostgreSQL 要求客户端连接到一个 database 后始终使用它,不可以切换,Klustron继承了这个要求。同时 PostgreSQL 提供了 schema 这个概念,它是一个逻辑层面的名字空间。在 PostgreSQL 中一个 database 里面可以创建任意数量的 schema,除了 database 和 schema 之外,其他数据库对象(比如表,索引,视图,存储过程,sequence 等)都一定属于某个 schema(名字空间)。引用这些数据库对象时候,如果不指定 schema 名称,那么就是在一个称为 search_path 变量的名字空间列表中依次按名字寻找这个对象。在一个连接中可以动态的修改 search_path 变量来修改名字空间查找的 schema 序列,使用 postgreSQL 的语法 set search_path。Klustron 完全继承了这些特征,在一个 MySQL 连接中如果要切换 schema,可以执行 PostgreSQL 的 set search_path 即可。
MySQL 的 database 概念其实是数据库对象的物理(目录存储位置)和逻辑(名字空间)合并为一体了,并且mysql其实也有schema的概念,只是每个mysql 的database也等价于一个schema。而 PostgreSQL 则把它们分开,实现了更大的灵活性和自由度。
为了完全兼容 MySQL 的这种行为,Klustron允许用户使用USE 语句或者 mysql_select_db() 切换current database,Klustron 支持在MySQL连接中,可选地(transform_create_db_to_schema 变量为true时)把create/drop database语句当做create/drop schema来执行。在MySQL连接中,transform_create_db_to_schema 默认为true并且transform_create_db_to_schema 对PostgreSQL连接不生效。这样从MySQL 使用KunlunBase-mydumper 导入数据后,可以使用USE语句或者mysql_select_db() 来切换当前 database,并且这两种方法都会修改search_path,与PostgreSQL中set search_path语句达到相同的效果。在transform_create_db_to_schema=true的情况下,所有从MySQL导入的database 都成为同属于同一个Klustron的database 的同名的schema,在原来的MySQL中的database下的每个表和其他数据库对象就被创建到了与那个database同名的schema下面。
从klustron-1.2 开始,klustron支持更加灵活的方式在 COM_INIT_DB 命令中指定数据库名称、schema名称或者两者,详见下节。
- COM_CHANGE_USER
在 MySQL 中这个命令除了可以切换当前用户之外,还可以切换 database 。由于上述原因,我们不支持切换数据库,但是可以切换当前用户和schema,所以只有 mysql_change_user() 函数调用指定的 database name 与当前连接已经连接的数据库相同时候,才可以正确执行,否则调用失败返回错误。
从klustron-1.2 开始,klustron支持更加灵活的方式在 COM_CHANGE_USER命令中指定数据库名称、schema名称或者两者,详见下节。
另外,用户也可以执行 PostgreSQL的 set session authorization,set role 等命令做用户/角色切换。
- 上述两个命令中的数据库名称
从klustron-1.2 开始,klustron支持更加灵活的方式在 COM_INIT_DB 和COM_CHANGE_USER命令中指定数据库名称、schema名称或者两者。
3.1. 决定默认schema的方法
首先,介绍字符串类型的配置变量mysql_default_schema,该变量只在MySQL连接中有效用。它是COM_INIT_DB 和COM_CHANGE_USER命令中没有设定schema名称时,默认使用的schema的名称。用户可以在计算节点的配置文件中设置它,来让客户端统一连接到特定的schema。如果该变量的值为空(NULL或者''控字符串''),那么此种情形的默认schema就是'public'。下文关于“默认schema”都以此方法决定。
在COM_CHANGE_USER命令中,用户可以指定形如 str1.str2 的字符串作为数据库名称,这里要求str1必须与这个连接的连接的数据库名称(记为current_database) 相同否则失败。在str1是current_database的情况下如果 str2是一个有效的schema名字,就把search_path 切换到current_database的str2 这个schema下面了; 如果str2不是current_database下的有效schema那么命令执行失败。
在COM_CHANGE_USER命令中,如果传入的database name参数是一个字符串 str,没有句点(.)隔开,那么如果str与current_database 名称相同,则切换到其默认schema 下(按照 3.1节所述方法决定);如果str 与current_database 名称不同,则检查str是否current_database 下的一个schema,如果有此名称的 schema则切换search_path 到此schema,否则此命令执行失败。
在COM_INIT_DB 命令中,如果database name形如str,没有句点隔开, Klustron会检查str是否一个存在的database,如果是则连接到此database的默认schema下面(按照 3.1节所述方法决定);否则,对于1.3.1之前的版本,此命令执行失败。从1.3.1开始,此种情况下系统假定str是一个在名为 mysql_default_db这个变量值的database下面的schema。如果确实有此database和schema,那么连接成功;否则连接失败。mysql_default_db默认是postgres,用户可以修改计算节点的配置文件来设置为系统中存在的任何database。
在COM_INIT_DB 命令中,如果database name形如str1.str2,那么str1必须是已经存在的database,并且str2必须是str1这个database里面存在的schema,否则连接失败。此连接就会连到str1这个database并设置current_schema为str2。
Klustron并没有改变search_path的查找规则:默认总会查找pg_catalog, pg_tempX等系统schema,然后才开始查找search_path指定的schema。
MySQL语法兼容性
postgreSQL 要求标识符名称字节数 <64 , 意味着如果标识符是中文的话,中文标识符最大字符数M在一个范围内变化,最小的 M 不到 20 个字符。这里的标识符包括 database,table,column,procedure 等
Klustron 对 MySQL 私有 DML 语法的支持 以及 Klustron 独特的变量读写功能介绍。并且无论在使用 PostgreSQL 协议的连接还是 MySQL 协议的连接中,都可以执行 Klustron 支持的任何语法,包括这些 MySQL 私有 DML 语法,也包括标准的 SQL 语法,以及 Klustron 支持的任何其他PostgreSQL私有语法。
Klustron 支持 autoincrement 关键字定义列为自增列,也支持 last_insert_id() 函数,其用法与 mysql 完全相同
Klustron 支持 MySQL 的所有私有数据类型,包括: a. TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB, VARBINARY, BINARY 在 Klustron 中统一按照 bytea 类型来存储和处理 b. TINYTEXT, MEDIUMTEXT, LONGTEXT 在 Klustron 中都统一按照 text 类型来存储和处理 c. DOUBLE (不带 PRECISION) d. byte, tinyint, mediumint, middleint, 以及所有整形类型的 UNSIGNED 修饰符 e. DATETIME:不带时区信息的时间戳。 f. TIMESTAMP 在 MySQL 和 PostgreSQL 中 TIMESTAMP 类型有不同的意义:在 MySQL 中它表示带有时区信息的时间戳,在 PostgreSQL 中表示不带时区信息的时间戳。为了与二者都保持一致,在 Klustron 中,在 mysql 连接中遵循 MySQL 的定义,在 PostgreSQL 连接中遵循 PostgreSQL 的定义。
Klustron 不支持用户定义的 MySQL 存储过程或者 MySQL 专有的 DDL 语法
Klustron 支持 MySQL 特有的系统函数,比如 unix_timestamp(), timediff(), str_to_date() 等等
Klustron 支持一系列常用 show 命令(如下)。
Klustron 不支持 load data infile 命令,用户可以使用 copy 命令完成同样的数据加载工作。
兼容 MySQL 变量读写语法
更新变量:送到每一个 storage shard 的主节点执行
- 只能更新部分变量,不开放全部变量更新(安全可控)
- session 变量同步到每个新的后端连接
- 全局变量的更新没有持久化,与 MySQL 相同
- set global innodb_lock_wait_timeout = 4;
- set session innodb_lock_wait_timeout = 3;
- set persist_only innodb_lock_wait_timeout = 11;
- set persist innodb_lock_wait_timeout = 11;
- set innodb_lock_wait_timeout = 2;
- set @@globa.innodb_lock_wait_timeout = 2;
- set @@session innodb_lock_wait_timeout = 2;
- set @@innodb_lock_wait_timeout = 2;
读取变量:随机选取一个 storage shard 的主节点读取
- show global variables like 'innodb_lock_wait_timeout';
- show session variables like 'innodb_lock_wait_timeout';
- show variables like 'innodb_lock_wait_timeout'
- select @@global.innodb_lock_wait_timeout, @@autocommit AS ac, @@session.sql_log_bin;
不限定连接种类(mysql/postgresql 连接均可执行)。
Klustron 独特的变量读写功能介绍
独特的变量读写攻能:支持部分 MySQL DBA 常用语法。
SHOW DATABASES
SHOW SCHEMAS
- 真 schema,用 database 做物理隔离,用 schema 做逻辑划分,适用于多部门多业务共享一套 db 集群。
- MySQL:用 database 做逻辑划分。
SHOW TABLES [ IN SCHEMA ... ]
SHOW COLLATION
SHOW CREATE TABLE [LIKE pattern ]
SHOW WARNINGS
SHOW ERRORS
SHOW PROCESSLIST
- 列出所有计算节点中的所有会话。
KILL connection/query
- 可以 kill 掉其他计算节点中的连接。
USE schema
- PostgreSQL 的 schema 相当于 MySQL 的database
- 更好的数据隔离,不仅基于访问控制规则,更安全。
- 为了允许用户使用USE 语句或者 mysql_select_db() 切换current database,Klustron在MySQL连接中默认会把create/drop database当做create/drop schema来执行,详见本文前面对 COM_INIT_DB 的介绍。
连接协议其他技术要点细节。
autocommit 和事务隐式开始 & 隐式提交。
事务开始和提交的方式没有绑定关系,隐式开始的事务可以显式或者隐式提交提交,显式开始的事务也可以显示或者隐式提交。这与MySQL也完全相同。
- 事务隐式开始: autocommit =off 时候执行 DML
- 事务隐式提交:执行如下语句之一。
- set autocommit = on;
- BEGIN/START TRANSACTION
- 部分 DDL 例如 create/drop/alter table/index/database/schema; alter column; rename/truncate/reindex/cluster table
- COMMIT (显式提交)
语句执行的错误处理
当设置 enable_stmt_subxact 为true后,语句执行错误后,只回滚语句,不回滚事务,由应用程序决定要(可选地在继续执行一些语句后)回滚还是提交这个事务。这样就达到了与MySQL相同的效果。如果enable_stmt_subxact 为false,那么语句执行错误后会回滚事务,也就是按照PostgreSQL的惯例来处理。
引号规则
- back-quote(`) : 内容是标识符, 例如
CREATE TABLE ` space table ` (` space col ` int)
- quote(') : 内容是字符串常量,例如:‘'this is a string constant', '这是一个字符串'
- double quote (")
- 在PostgreSQL 连接中,内容是标识符,例如:
CREATE TABLE " space table " (" space col " int)
- 在MySQL连接中,如果 mysql_ansi_quotes=true , 与PostgreSQL连接中行为相同,内容是标识符。这等价于MySQL中为sql_mode 设置ANSI_QUOTES 标志;否则内容是字符串常量,相当于MySQL中sql_mode没有设置ANSI_QUOTES的行为。
在 MySQL 和 PostgreSQL 连接中意义不同的运算符。
||, &&, ^ 这些运算符在MySQL连接中遵循其在MySQL的定义和用法;在PostgreSQL连接中遵循其在PostgreSQL中的定义和用法。
含有 ||, &&, ^ 运算符的存储过程只能在与其创建时所用的连接相同类型的连接中运行 如果在MySQL连接中创建的存储过程(使用的仍然是PostgreSQL PL/SQL语法)使用了这些运算符,那么这个存储过程只能在MySQL连接中使用;如果在PostgreSQL连接中创建的存储过程使用了这些运算符,那么这个存储过程只能在PostgreSQL连接中使用。如果一个存储过程没有使用这些运算符,那么它可以在MySQL或者PostgreSQL连接中被使用。
? 运算符在MySQL连接中是prepared statement的参数占位符,在PostgreSQL连接中作为普通运算符处理
autoincrement
- 一个表可以有多个 autoincrement 列, 字段值为 default,null 或者不存在时自动产生数值。
- 支持 last_insert_id() 函数。
- 不可以显式设定 offset和起始值
SSL支持
目前我们还没有实现 Klustron MySQL 协议的 SSL 支持,在未来的版本中会支持 SSL 连接。目前应用程序无法调用任何 MySQL 客户端SSL API 与Klustron 工作。