MySQL中文参考手册译者:晏子 ([email protected]) 主页:http://linuxdb.yeah.net
mysqld可以用下列语言发出错误消息:捷克语、荷兰语、英语(缺省)、爱沙尼亚语、法语、德语、匈牙利、意大利语、挪威语。
启动mysqld使用一种特定的语言,使用一个--language=lang或-L
lang选项。例如:
shell> mysqld --language=swedish
或:
shell> mysqld --language=/usr/local/share/swedish
注意,所有语言的名称用小写字母指定。
语言文件位于(缺省的)'mysql_base_dir/share/LANGUAGE/'。
为了更新错误消息文件,你应该编辑“errmsg.txt”文件并且执行下列命令生成“errmsg.sys”文件:
shell> comp_err errmsg.txt errmsg.sys
如果你升级到一个更新的MySQL版本,记得要再次用新的“errmsg.txt”文件进行更新。
缺省地,MySQL使用 ISO-8859-1 ( Latin1 ) 字符集。这是在美国和西欧使用的字符集。
字符集决定了在名字中允许什么字符和如何由SELECT语句的ORDER
BY和GROUP BY子句排序。
通过给configure以--with-charset=charset选项,你可以在编译时改变字符集。见4.7.1 快速安装概述。
为了把其他字符集加入MySQL,使用下列过程:
MYSET表示。 ctype_MYSET、to_lower_MYSET等等的名字。to_lower[]和to_upper[]是简单的数组,保存字符集每个成员相应的小写和大写字符。例如:
to_lower['A'] should contain 'a' to_upper['a'] should contain 'A'
sort_order[]是一个映射,指出字符为了比较和排序目的应该如何定序。对于许多字符集,这与to_upper[]一样(意味着排序将忽略大小写)。MySQL将基于sort_order[character]值排序字符。ctype[]是一个位值的数组,一个元素对应一个字符。(注意,to_lower[]、to_upper[]和sort_order[]按字符定下标,但是ctype[]按字符值+1定下标。这是一个旧遗产以便能处理EOF)
你能在“m_ctype.h”找到下列bitmask定义:
#define _U 01 /* Upper case */ #define _L 02 /* Lower case */ #define _N 04 /* Numeral (digit) */ #define _S 010 /* Spacing character */ #define _P 020 /* Punctuation */ #define _C 040 /* Control character */ #define _B 0100 /* Blank */ #define _X 0200 /* heXadecimal digit */
每个字符的ctype[]的入口应该是描述字符的适用的位模(bitmask)值的联合(union)。例如,'A'是一个大写字符(_U)
,同时是十六进制位(_X),这样ctype['A'+1]应该包含值:
_U + _X = 01 + 0200 = 0201
configure.in中的CHARSETS_AVAILABLE表。
如果你正在创建一个多字节字符集,你可以使用_MB宏。在“include/m_ctype.h.in”,增加:
#define MY_CHARSET_MYSET X #if MY_CHARSET_CURRENT == MY_CHARSET_MYSET #define USE_MB #define USE_MB_IDENT #define ismbchar(p, end) (...) #define ismbhead(c) (...) #define mbcharlen(c) (...) #define MBMAXLEN N #endif
这里:
MY_CHARSET_MYSET |
一个唯一的字符集值。 |
USE_MB |
这个字符集有多字节字符,由ismbhead()和mbcharlen()来处理。 |
USE_MB_IDENT |
(可选 ) 如果定义,你能使用多字节字符的表和列名。 |
ismbchar(p, e) |
如果p不是一个多字节字符字符串,返回0,否则如果它是,返回字符的大小(字节数)。p和e指向字符串的开始和结束。检查是从(char*)p到(char*)e-1。
|
ismbhead(c) |
如果c是一个多字节字符字符串的第一个字符,返回真。 |
mbcharlen(c) |
如果c是一个多字节字符串的第一个字符,返回该字符串的大小。 |
MBMAXLEN |
在字符集中最大字符的字节大小。 |
当以--log-update=file_name选项启动时,mysqld将所有更新数据的SQL命令写入记录文件中。文件被写入数据目录并且有一个名字file_name.#,这里#是一个数字,它在每次执行mysqladmin
refresh或mysqladmin flush-logs、FLUSH LOGS语句、或重启服务器时加1。
如果你使用--log或-l选项,mysqld用一个文件名“hostname.log”写一个通用的记录文件,并且重启和更新不会引起一个新的记录文件生成(尽管它被关闭并且再打开)。缺省地,mysql.server脚本用-l选项启动MySQL服务器,如果当你在生产环境中开始使用MySQL时,你需要好一些的性能,你可以从mysql.server中删除-l选项。
更新记录很聪明,因为它仅仅记载真正更新数据的语句。因此一个用WHERE的UPDATE或DELETE找不到行,它就不被写入记录文件。它甚至跳过将设置一个列为它已经有的值的UPDATE语句。
如果你想要从更新记录文件更新一个数据库,你可以如下做到(假设你的更新记录有“file_name.#”形式的名字):
shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql
ls被用来以正确的次序得到所有的记录文件。
如果你必须在一个崩溃后恢复到备份文件并且你想要再做发生在备份和崩溃之间的更新,这可以很有用。
当你在其他主机上有一个镜像数据库并且你想要复制必须对主数据库进行的改变时,你也可以使用更新记录。
MySQL 3.22 在表大小上有一个4G的限制。使用在MySQL 3.23中的新MyISAM 最大的表大小可达8百万 TB(2^63个字节)。
然而注意,操作系统有其自身文件大小的限制。在Linux上,当前的限制是2G;在Solaris 2.5.1上,限制是4G;在Solaris 2.6上,限制是1000G。这意味着MySQL表的大小通常由操作系统限制。
缺省地,MySQL表最大尺寸大约4G。你可用SHOW TABLE
STATUS命令或myisamchk -dv table_name检查一个表的最大表大小。见7.21 SHOW句法(得到表、列等的信息)。
如果你需要大于 4G 的表(并且你的操作系统支持它),你应该在你创建表时设定AVG_ROW_LENGTH和MAX_ROWS参数。见7.7 CREATE TABLE语法。你也能用ALTER
TABLE在以后设置这些。见7.8
ALTER TABLE语法。
如果你的大表要变成只读,你可以使用myisampack合并并且把许多表压缩成一个。myisampack通常压缩一个表到至少50%,因此你可以有,实际上,更大的表。见12.5 MySQL压缩的只读的表生成器。
另一个的解决方案可以是内含包括MERGE库,它允许你将一个许多相同的表的集合作为一个来处理。(在这种情况下相同意味着所有的表由相同的列信息创建)目前MERGE只能用于扫描一个表集合,因为它不支持索引。我们在不久的将来将把索引加进去。
用MySQL,目前(版本 3.23.6)你可以在三种基本数据库表格式间选择。当你创建一张表时,你可以告诉MySQL它应该对于表使用哪个表类型。MySQL将总是创建一个.frm文件保存表和列定义。视表类型而定,索引和数据将在其他文件中存储。
你能用ALTER TABLE语句在不同类型的表之间变换。见7.8 ALTER TABLE语法。
MyISAMMyISAM是缺省表格类型,它是基于ISAM代码并且有很多有用的扩展。索引存储在一个有.MYI(MYindex)扩展名的文件并且数据存储在有.MYD(MYData)扩展名的文件中。你能用myisamchk实用程序检查/修复MyISAM表。见13.4 对崩溃恢复使用myisamchk。下列几点在MyISAM中是全新的:
INSERT一个新行,在其他线程从表中正在读取的同时。
AUTO_INCREMENT列的内部处理。MyISAM将自动地在INSERT/UPDATE时更新它。
AUTO_INCREMENT值可以用myisamchk重新设置,这将使得AUTO_INCREMENT列更快速并且原来的数将不象老的ISAM那样被重新使用。注意,当一个AUTO_INCREMENT定义在一个多部键值(multi-part-key)的结尾时,老式的行为仍然是存在。
BLOB和TEXT列可以被索引。 NULL值。每个键占0-1个字节。 myisamchk就可以放大到64。
MyISAM显示桌子是否正确被关上的文件。这将不久被用于自动的修理在MySQL服务器。
myisamchk将标记表为“检查的”。myisamchk --fast将仅仅检查那些没有这个标记的表。
myisamchk -a存储键值组成部分的统计(不只是像ISAM对整个键)。
myisampack能紧缩BLOB和VARCHAR列。 MyISAM也支持下列东西,MySQL在不久的将来将能使用。
VARCHAR类型;一个VARCHAR列以2各字节存储的长度开始。
VARCHAR的表可以式固定或动态的记录长度。 VARCHAR和CHAR可以最大64K字节。所有的关键字片断有其自身的语言定义,这将使得MySQL每列有不同的语言定义。
UNIQUE;这将允许你在一个表中的任何列组合上有UNIQUE属性。(然而,你不能搜索一个UNIQUE计算的索引。)你也可以使用放弃的ISAM桌子类型。这将在不久消失,因为MyISAM是同一个东西的更好实现。ISAM使用一个B-tree索引,这个索引存储在一个有.ISM扩展名的文件中并且数据存储在有.ISD扩展名的文件中,你可用isamchk实用程序检查/修复ISAM表。见13.4 使用myisamchk恢复崩溃。ISAM表不是跨OS/平台二进制可移植的。ISAM有下列特征/属性:
HEAP HEAP表格使用一个杂凑(hashed)索引并且存储在内存中。这使他们更快,但是如果MySQL崩溃,你将失去所有存储的数据。HEAP作为临时表很可用!
CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down
FROM log_table GROUP BY ip;
SELECT COUNT(ip),AVG(down) FROM test;
DROP TABLE test;
当你使用HEAP表时,这里是你应该考虑的一些事情:
CREATE语句中指定MAX_ROWS以保证你有意不使用所有的内存。
=和<=>一起使用(但是很快)。
HEAP表使用一个固定的记录长度格式。 HEAP不支持BLOB/TEXT列。 HEAP不支持AUTO_INCREMENT列。 HEAP不支持在一个NULL列上的索引。 HEAP表中有非唯一键(杂凑表一般不这样)。 HEAP表格在所有的客户之间被共享(就象任何其他的表)。 HEAP表的数据以小块分配。表是100%动态的(在插入时),无需溢出区和额外的键空间。删除的行放入一个链接表并且当你把新数据插入到表时,它将被再次使用。
DELETE FROM heap_table或DROP
TABLE heap_table。 max_heap_table_size大的HEAP表。