热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL与标准的兼容性_MySQL

MySQL与标准的兼容性
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   
  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句法。
  
  存储过程和触发器
  一个存储过程是能在服务器中编译并存储的一套SQL命令。一旦这样做了,顾客不需要一直重新发出全部查询,而可以参考存储过程。因为查询仅需一次词法分析并且较少的信息需要在服务器和客户之间传送,因此这提供了更好的性能。你与可以通过拥有在服务器中的函数库提升概念上的层次

推荐阅读
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
author-avatar
李淑宝彦豪俊嵐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有