您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

有关MySQL数据库与标准的兼容性问题

2025/5/20 15:57:42发布38次查看
mysql包含了一些可能在其他sql数据库找不到的扩充。要注意如果你使用他们,你的代码将不与其他sql服务器兼容。在一些情况下,你可以编写包括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中下列语句还不能工作:
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product