作者:创新互联 文章来源:虚拟主机 点击数: 更新时间:2013-04-21

MySQL包含了一些可能在其他SQL数据库找不到的扩充。要注意如果你使用他们,你的代码把不与其他SQL服务器兼容。在一些情况下,你可以编写包括MySQL扩展的代码,但是仍然是可移植的,通过使用/*! ... */形式的注释。在这种情况下,MySQL把进行词法分析并且执行在注释内的代码,好像它是任何其它MySQL语句,但是其他SQL服务器把忽略扩展。例如:

SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...

如果你在'!'后增加一个版本数字,该语法把仅在MySQL版本是等于或比使用的版本数字新时才执行:

CREATE /*!32302 TEMPORARY */ TABLE (a int);

上面的意思是如果你有3.23.02或更新,那么MySQL把使用TEMPORARY关键词。

MySQL扩展被列在下面:

字段类型MEDIUMINT、SET、ENUM和不同的BLOB和TEXT类型。

字段属性AUTO_INCREMENT、BINARY、UNSIGNED和ZEROFILL。

缺省地,所有的字符串比较是忽略大小写的,由当前的字符集决定了(缺省为ISO-8859-1 Latin1)排序顺序。如果你不喜欢这样,你应该用BINARY属性或使用BINARY强制符声明列,它导致根据MySQL服务器主机的ASCII顺序进行排序。

MySQL把每个数据库映射一个MySQL数据目录下面的目录,把数据库表映射到数据库目录下的数据库文件名。这有2个含意:

在区分大小写文件名的操作系统(象大多数 Unix 系统一样)上的MySQL中数据库名字和表名是区分大小写的。如果你有困难记得表名,接受一个一致的约定,例如总是用小写名字创建数据库和表。

数据库、表、索引、列或别名可以以数字开始(但是不能仅由数字组成)。

你可以使用标准的系统命令备份、重命名、移动、删除和拷贝表。例如,重命名一个表,重命名“.MYD”、“.MYI”和“.frm”文件为相应的表。

在SQL语句中,你可以用db_name.tbl_name语法访问不同数据库中的表。一些SQL服务器提供同样的功能但是称它们为这User space(用户空间)。MySQL不支持类似在create table ralph.my_table...IN my_tablespace中的表空间。

LIKE在数字列上被允许。

在一SELECT语句里面使用INTO OUTFILE和STRAIGHT_JOIN。见7.12 SELECT句法.

在一个SELECT语句中SQL_SMALL_RESULT选项。

EXPLAIN SELECT得到怎么样联结表的描述。

在一个CREATE TABLE语句里面使用索引、在字段前缀上的索引和使用INDEX或KEY。见7.7 CREATE TABLE 句法。

CREATE TABLE使用TEMPORARY或IF NOT EXISTS。

使用COUNT(DISTINCT list),这里“list”超过一个元素。

在一个ALTER TABLE语句里面使用CHANGE col_name、DROP col_name或DROP INDEX。见7.8 ALTER TABLE句法。

在一个ALTER TABLE里面语句使用IGNORE。

在一个ALTER TABLE语句中使用多重ADD、ALTER、DROP或CHANGE子句。

使用带关键词IF EXISTS的DROP TABLE。

你能用单个DROP TABLE语句抛弃多个表。

DELETE语句的LIMIT子句。

INSERT和REPLACE语句的DELAYED子句。

INSERT, REPLACE, DELETE和UPDATE语句的LOW_PRIORITY子句。

使用LOAD DATA INFILE。在多数情况下,这句法与Oracle的LOAD DATA INFILE兼容。见7.16 LOAD DATA INFILE 句法。

OPTIMIZE TABLE语句。。

SHOW语句。见7.21 SHOW句法(得到表、列等的信息)。

字符串可以被“"”或“'”包围,而不只是“'”。

使用“\”转义字符。

SET OPTION语句。见7.25 SET OPTION句法。

你不需要命名所有在GROUP BY部分的被选择的列。这为一些很特定的情况给出更好的性能,而不是一般的查询。

为了方便来自于SQL环境其他为用户,MySQL对许多函数支持别名。例如,所有的字符串功能都支持ANSI SQL句法和 ODBC句法。

MySQL理解||和&&意味着逻辑的OR和AND,就像在C程序语言中。在MySQL中,||和OR是同义词,&&和AND是同义词。正因为这个好的句法,MySQL对字符串并置的不支持ANSI SQL ||操作符;相反使用CONCAT(),因为CONCAT()接受任何数量的参数,很容易把||操作符使用变换到MySQL。

CREATE DATABASE或DROP DATABASE。见7.5 CREATE DATABASE句法。

%操作符是MOD()一个同义词,即,N % M等价于MOD(N,M)。%支持C程序员并与PostgreSQL兼容。

=, <>, <=,=,>, <>, <=>, AND, OR或LIKE操作符可以放在SELECT语句的FROM左边用于比较列。例如:

mysql> SELECT col1=1 AND col2=2 FROM tbl_name;

LAST_INSERT_ID()函数。见20.4.29 mysql_insert_id()。

扩展的正则表达式操作符REGEXP和NOT REGEXP。

CONCAT()或CHAR()有一个参数或超过2个参数。(在MySQL中,这些函数可取任何数量的参数。)

BIT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), md5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(),或WEEKDAY()函数。

使用TRIM()整修子串。ANSI SQL 只支持单个字符的删除。

GROUP BY函数STD(), BIT_OR()和BIT_AND()。

使用REPLACE而不是DELETE+INSERT。见7.15 REPLACE句法。

FLUSH flush_option语句。

在一个语句用:=设置变量的可能性:

SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table;

SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

以ANSI模式运行MySQL

如果你用--ansi选项启动mysqld,MySQL的下列行为改变。

||是字符串并置而不是OR。

可在一个函数名字之间与“(”有任何数量的空格。这也使所有的功能名字成为保留词。

"把是一个标识符引号字符(象MySQL `引号字符一样)而不是一个字符串引号字符。

REAL把是FLOAT一个同义词,不是DOUBLE一个同义词。

5.3 MySQL相比ANSI SQL92的差别

我们尝试使得MySQL遵照ANSI SQL标准和ODBC SQL标准,但是在一些情况下,MySQL做一些不同的事情:

--只是一个注释,如果后面跟一个白空字符。`--'作为一个注释的开始。

对于VARCHAR列,当值被存储时,拖后的空格被删除。见E MySQL已知的错误和设计缺限。

在一些情况下,CHAR列偷偷地被改变为VARCHAR列。平静的列指定变化。

当你删除一个表时,对表的权限不自动地废除。你必须明确地发出一个REVOKE来废除对一个表的权限。见7.26 GRANT和REVOKE句法。

MySQL缺乏的功能

下列功能在当前的MySQL版本是没有的。对于一张优先级表指出何时新扩展可以加入MySQL, 你应该咨询在线MySQL TODO 表。这是本手册最新的TODO表版本。见F 我们想要在未来加入到MySQL的事情列表(TODO)。

子选择

在MySQL中下列语句还不能工作:

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);

然而,在很多情况下,你可以重写查询,而不用子选择:

SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL

对于更复杂的子查询,通常你可以创建临时的表保存子查询。然而在一些情况下,这种选择把行不通。最经常遇到的情形是DELETE语句,对于它标准SQL不支持联结(join)(除了在子选择)。对于这种情况,有2个可用选择,直到子选择被MySQL支持。

第一个选择是使用一种过程化的程序语言(例如Perl或PHP)来提交一个SELECT查询获得要被删除记录主键,并然后使用这些值构造DELETE语句(DELETE FROM ... WHERE ... IN (key1, key2, ...))。

第二个选择是使用交互式SQL自动构造一套DELETE语句,使用MySQL扩展CONCAT()(代替标准||操作符)。例如:

SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';')

FROM tab1, tab2

WHERE tab1.col1 = tab2.col2;

你可以把这个查询放在一个脚本文件并且从它重定向输入到mysql命令行解释器,把其输出作为管道返回给解释器的第2个实例:

prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydb

MySQL仅支持INSERT ... SELECT ...和REPLACE ... SELECT ...,独立的子选择把可能在3.24.0得到,然而,在其他环境下,你现在可以使用函数IN()。

SELECT INTO TABLE

MySQL还不支持Oracle SQL的扩展:SELECT ... INTO TABLE ....,相反MySQL支持ANSI SQL句法INSERT INTO ... SELECT ...,基本上他们是一样的。

另外,你可使用SELECT INTO OUTFILE...或CREATE TABLE ... SELECT解决你的问题。

事务处理

不支持事务处理。MySQL把在短时间内支持原子(atomic)操作,它象没有回卷的事务。用原子操作,你能执行一组INSERT/SELECT/whatever 命令并且保证没有其他线程介入。在本文中,你通常不会需要回卷。目前,你可通过使用LOCK TABLES和UNLOCK TABLES命令阻止其他线程的干扰。见7.24 LOCK TABLES/UNLOCK TABLES句法。

存储过程和

mysql兼容性高吗_MySQL与标准的兼容性相关推荐

  1. mysql数据库高可用_MySQL数据库高可用

    一.MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件.运行在代码应用和MySQL数据库之间的应用. 前身 : corb ...

  2. mysql 升级高可用_MySQL高可用方案升级规划

    这是学习笔记的第2035篇文章 这两天在梳理MySQL高可用方案的升级计划,发现要做的事情还真不少. 我们目前有新系统和老系统,老系统因为历史原因使用的是MySQL 5.5版本,新系统有了整体的规划, ...

  3. mysql galera 高并发_MySQL的高可用性集群Galera Cluste

    一.Galera Cluste简介 1.Galera Cluster 集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版 ...

  4. mysql三台高可用_Mysql高可用,实现方案

    https://www.cnblogs.com/nuanxin/p/5665840.html 对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用 ...

  5. mysql版本号超买_MySQL处理高并发,防止库存超卖

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

  6. mysql性能调优 高可用_MySQL性能调优与架构设计——第 17 章 高可用设计之思路及方案...

    第 17 章 高可用设计之思路及方案 前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库 ...

  7. nginx实现mysql高可用_MySQL高可用

    3,nfs高可用,keepalive使用脚本(自己编写)vrrp_script {},通过脚本返回的状态(根据keepalive自定)判断drbd的主从,然后飘动vip,同时再触发脚本,切换drbd的 ...

  8. 初探mysql innodb集群_MySQL InnoDB Cluster搭建

    MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如MMM, MHA, NDB Cluster, Galera Cluster, InnoDB Cluste ...

  9. 【稳定性day10】美团MySQL的高可用架构 - 对标业内的一些解决方案

    本文来自美团蔡金龙老师的分享,介绍了最近几年美团点评MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新.同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我 ...

最新文章

  1. 台湾前十大科技公司拼不过三星(往后一点三星都不要买啦!)
  2. cni k8s 插件安装_第一次,如此清晰脱俗的直解K8S网络
  3. jq append添加的元素click获取不到的解决方法
  4. 神奇的marquee--滚动的文字
  5. Protobuf 安装及 Python、C# 示例
  6. python反转列表不用切片,在Python中反转切片
  7. ulimit限制 新系统_说来惭愧,我被ulimit摔了一跤...
  8. Boost锁~临界区保护和临界资源共享
  9. 需要自己调研的框架,以及需要学习的内容
  10. 设置android:sharedUserId=android.uid.system 支持 sdcard读写
  11. 使用 Direct Initial Load 初始化 GoldenGate 同步数据
  12. 苹果因芯片短缺优先生产iPhone 13 常规iPad平均交付时间超7周
  13. C++_类和对象_C++运算符重载_加号运算符重载_实现两个对象相加_对象和int类型相加_通过成员函数重载+号_全局函数重载+号_以及重载_运算符重载函数实现---C++语言工作笔记055
  14. vue升级之路(四)-- Vuex
  15. 三种水平居中布局~详细
  16. mysql宾馆客房管理系统视频_java swing mysql实现的酒店宾馆管理系统项目源码附带视频指导运行教程...
  17. 如何用BIGEMAP在Arcgis中使用bigemap制作特定比例尺的交通位置图
  18. android 时钟动态图标,安卓 8.1 Launcher3实现动态指针时钟功能
  19. 世界银行为孟加拉国建设数据中心提供贷款
  20. HDU 6438 Buy and Resell 【贪心+思维+优先队列】

热门文章

  1. 2020年行政区划代码_2020年南宁市行政区划,了解南宁市有几个区,详细数据
  2. 怎么下载正版am_新买的笔记本电脑如何重装自带的正版Office学生版
  3. 利用图基Tukey method检测数据集中的异常值
  4. 安装 elasticsearch-head
  5. java反射 面试题_使用Java反射更改私有静态最终字段
  6. java to对象_java中同类对象之间的compareTo()和compare()方法对比分析
  7. 如何做相册_腾讯相册管家再创相册管理软件新纪元
  8. rola物联网框架_如何搭建一个物联网系统框架?
  9. e7xue.php漏洞_简要分析最近的dedecms通杀漏洞以及漏洞补丁的绕过
  10. java通用解析excel_java读取简单excel通用工具类