Halo 数据库正式兼容 MySQL5.7
个研发 个测试,从 年 月初立项并开始开发,到 年 月完成初版,然后继续改进和测试,到
年 月初,终于拿出了一个正式版本,总计历时半年。
正式版本经过了全面的功能测试(包含各种常见 场景的上万条测试 )和 压测
( 小时),稳定且性能良好,可以上线运行。
记得最初立项的时候,初步做了一些调研,网上的文章谈论 和 之间的语法差异,一般都是
说 ,, ! 等几个,然后就是字段类型的差异,给人的感觉是差异很小,
兼容起来很简单。
事实上,等到我们开始开发,同步开始全面研究 语法,编写测试 时,发现两者之间的差异,远超
网上的泛泛之言。
今天这个文章,想和大家分享我们 "(基于 #$%)兼容了 哪些主要语法(至于具体的
实现方式,一般都是通过改写词法语法文件,以及改写后续的执行流程等,总的来说挑战不小),供有兴趣的朋
友参考。
下文中我们把兼容 %$ 的 " 数据库称为 "#。
1、insert ignore
) &的 '用法
插入的数据存在冲突(根据主键或者唯一索引判断)时,本次插入无效;没有主键冲突时,直接插入数据。
一般的写法为:
( )***+,,+-.
) 无此用法,但是有与之对应的功能语法,一般的写法为:
( )***+,,+-/)-.
)"# 支持 &的 '行为和语法细则,与 完全一致。
2、replace into
) &的 '用法
插入的数据存在冲突(根据主键或者唯一索引判断)时,则先删除此行数据,然后插入新的数据;否则,直接插
入新数据。
一般的写法为:
( )***+,,+-.
)无此用法( 语法是 独有的,且挺受欢迎)。
)"# 支持 &的 '行为和语法细则,与 完全一致。
3、on duplicate key
) &的 '用法
根据主键 或唯一键来判断当前插入是否已存在。记录已存在时,只会更新 ! 之后
指定的字段。如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。
一般的写法为:
( )***+,,+- ! 0*0*0*10
+,,+.
( )**+,,+*++- ! 0( )-*10
( )1-*10( )1-.
) &存在与之对应的功能 / ' 。
一般的写法为:
( )***+,,+-/ )- 0*0*0*
10+,,+.
( )**+,,+*++-/ )- 02 $*
102 $1*102 $1.
( )**+,,+*++-/ )- )*1*1-0
)2 $*2 $1*2 $1-.
)"# 支持 &的 '行为和语法细则,与 完全一致。
4、value
语句中用 ( 而不是 ( 的人估计很少,但既然是 的合法语法,我们就得支
持。以下一些语法差异类似。
) &的 3( '用法
4 与 ( 没有区别,可以混用,只是两者对不同语句插入数量的执行效率各不相同。
一般的写法为:
( )***+,,+-.
( )***+,,+-.
( )***+,,+-*)***+,,+-*)%*%*%*+,,+-.
的 或 语句中,( 部分可以用 ( 代替。
) 无此用法。
)"# 支持 &的 ( '行为和语法细则,与 完全一致。
5、单双引号
看起来不起眼的单双引号,给我们造成了不小的麻烦。
) & '的 单双引号 用法
引用字符串常量时候需要用一对英文单引号或者双引号。在一般使用的时候单引号和双引号没有什么区别。
一般的写法为:
5661+*1758!755.
+6615*17+8!7++.
)也有单双引号,其中只能用单引号表示值,双引号是表示系统标识符的(比如表名或者字段
名)。 则使用反单引号表示系统标识符。
一般的写法为:
5159155,550.
)"# 支持 & '的 单双引号 行为和语法细则,与 完全一致。
为了支持 的单双引号,包括下面的 !! 符号,我们费了一点心思。这是最初项目开始时完全没有
想到的。
评论