当前位置:首页 >> 计算机软件及应用 >>

MySQL数据库常见错误提示的对照表


145 :文件无法打开,使用 repair.php 修复 1005:创建表失败。 1006:创建数据库失败。 1007:数据库已存在,创建数据库失败。 1008:数据库不存在,删除数据库失败。 1009:不能删除数据库文件导致删除数据库失败。 1010:不能删除数据目录导致删除数据库失败。 1011:删除数据库文件失败。 1012:不能读取系统表中的记录。 1016:文件无法打开,使用后台修复或者使用 phpmyadmin 进行修复。 1017:服务器非法关机,导致该文件损坏。************解决方法************ 1020:记录已被其他用户修改。 1021:硬盘剩余空间不足,请加大硬盘可用空间。 1022:关键字重复,更改记录失败。 1023:关闭时发生错误。 1024:读文件错误。 1025:更改名字时发生错误。 1026:写文件错误。 1030:可能是服务器不稳定。 (具体原因不是很清楚)************解决方法************ 1032:记录不存在。 1036:数据表是只读的,不能对它进行修改。 1037:系统内存不足,请重启数据库或重启服务器。

1038:用于排序的内存不足,请增大排序缓冲区。 1040:已到达数据库的最大连接数,请加大数据库可用连接数。 1041:系统内存不足。 1042:无效的主机名。 1043:无效连接。 1044:数据库用户权限不足,请联系空间商解决。 1045:数据库服务器/数据库用户名/数据库名/数据库密码错误,请联系空间商检查帐户。 1046:没有选择数据库。 1048:字段不能为空。 1049:数据库不存在。 1050:数据表已存在。 1051:数据表不存在。 1054:字段不存在或程序文件跟数据库有冲突,请使用正确的程序文件上传上去覆盖。 1060:字段重复,导致无法插入这个字段。 1062:字段值重复,入库失败。************解决方法************ 1064:MySQL 不支持错误提示中的编码。************解决方法************ 1065:无效的 SQL 语句,SQL 语句为空。 1067:MySQL 版本为 5,不支持空的默认值。 1081:不能建立 Socket 连接。 1114:数据表已满,不能容纳任何记录。 1115:设置的字符集在 MySQL 并没有支持。 1116:打开的数据表太多。

1129:数据库出现异常,请重启数据库。 1130:连接数据库失败,没有连接数据库的权限。 1133:数据库用户不存在。 1135:可能是内存不足够,请联系空间商解决。 1141:当前用户无权访问数据库。 1142:当前用户无权访问数据表。 1143:当前用户无权访问数据表中的字段。 1146:数据表缺失,请恢复备份数据。 1147:未定义用户对数据表的访问权限。 1149:SQL 语句语法错误。 1158:网络错误,出现读错误,请检查网络连接状况。 1159:网络错误,读超时,请检查网络连接状况。 1160:网络错误,出现写错误,请检查网络连接状况。 1161:网络错误,写超时,请检查网络连接状况。 1169:字段值重复,更新记录失败。 1177:打开数据表失败。 1180:提交事务失败。 1181:回滚事务失败。 1193:不支持字符集限定(SET NAMES)。************解决方法************ 1203: 当前用户和数据库建立的连接已到达数据库的最大连接数, 请增大可用的数据库连接 数或重启数据库。 1205:加锁超时。 1211:当前用户没有创建用户的权限。

1216:外键约束检查失败,更新子表记录失败。 1217:外键约束检查失败,删除或修改主表记录失败。 1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器。 1227:权限不足,您无权进行此操作。 1235:MySQL 版本过低,不具有本功能。 1251: Client 不能支持 authentication protocol 的要求。 不知道解释是否正确) ( ************ 解决方法************ 1267:不合法的混合字符集。************解决方法************ 2002:服务器端口不对,请咨询空间商正确的端口。 2003:MySQL 服务没有启动,请启动该服务。 2013: 远程连接数据库是有时会有这个问题, MySQL 服务器在执行一条 SQL 语句的时候失 去了连接造成的

***************************Mysql 常见错误集锦****************************** ***

1. Host ’...’ is blocked 错误 如果你得到象这样的一个错误: Host ’hostname’ is blocked because of many connection errors. Unblock with ’mysqladmin flush-hosts’ 这意味着, mysqld 已经得到了大量(max_connect_errors)的主机’hostname’的在中途被中断了的连接 请求。在 max_connect_errors 次失败请求后,mysqld 认定出错了(象来字一个黑客的攻击),并且阻止 该站点进一步的连接,直到某人执行命令 mysqladmin flush-hosts。 缺省地,mysqld 在 10 个连接错误后阻塞一台主机。你可以通过象这样启动服务器很容易地调整它: shell> safe_mysqld -O max_connect_errors=10000 & 注意,对给定的主机,如果得到这条错误消息,你应该首先检查该主机的 TCP/IP 连接有没有问题。如果 你的 TCP/IP 连接不在运行,增加 max_connect_errors 变量的值对你也不会有帮助! 2. Too many connections 错误 如果在你试土连接 MySQL 时,你得到错误 Too many connections,这意味着已经有 max_connecti

ons 个客户连接了 mysqld 服务器。 如果你需要比缺省(100)更多的连接,那么你应该重启 mysqld,用更大的 max_connections 变量值。 注意,mysqld 实际上允许(max_connections+1)个客户连接。最后一个连接是为一个用 Process 权限 的用户保留的。通过不把这个权限给一般用户(他们不应该需要它),有这个权限一个管理员可以登录并且 使用 SHOW PROCESSLIST 找出什么可能出错。见 7.21 SHOW 句法(得到表,列的信息)。

3. Out of memory 错误 如果你发出查询并且得到类似于下面的错误: mysql: Out of memory at line 42, ’malloc.c’ mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k) ERROR 2008: MySQL client ran out of memory 注意,错误指向了 MySQL 客户 mysql。这个错误的原因很简单,客户没有足够的内存存储全部结果。 为了修正这个问题,首先检查你的查询是否正确。它应该返回这么多的行,这合理吗?如果是这样,你可 以使用 mysql --quick,它使用 mysql_use_result()检索结果集合。这将较少的负担放在了客户端(只 是服务器更多)。 4.Packet too large 错误 当一个 MySQL 客户或 mysqld 服务器得到一个比 max_allowed_packet 个字节长的包,它发出一个 P acket too large 错误并终止连接。 如果你正在使用 mysql 客户,你可以通过用 mysql --set-variable=max_allowed_packet=8M 指定 一个更大的缓冲区来启动客户程序。 如果你正在使用不允许你指定最大包大小的其他客户(例如 DBI),你需要在你启动服务器时设置包大小。 你可以使用 mysqld 的命令行选项设置 max_allowed_packet 为一个更大的尺寸。例如,如果你正期望 将一个全长的 BLOB 存入一张表中, 你将需要用--set-variable=max_allowed_packet=24M 选项来启 动服务器。

5. The table is full 错误 这个错误发生在内存临时表变得比 tmp_table_size 字节大时。为了避免这个问题,你可以使用 mysqld 的-O tmp_table_size=#选项来增加临时表的大小,或在你发出有疑问的查询之前使用 SQL 选项 SQL _BIG_TABLES。见 7.25 SET OPTION 句法。 你也可以使用--big-tables 选项启动 mysqld。这与为所有查询使用 SQL_BIG_TABLES 完全相同。 6. Commands out of sync in client 错误 如果你在你的客户代码中得到 Commands out of sync; You can’t run this command now, 你正 在以错误的次序调用客户函数! 这可能发生,例如,如果你正在使用 mysql_use_result()并且在你已经调用了 mysql_free_result()之 前试图执行新查询。 如果你在 mysql_use_result()或 mysql_store_result()之间试图执行返回数据的 2 个查询,它也可能发生。 7. Ignoring user 错误 如果你得到下列错误: Found wrong password for user: ’some_user@some_host’; Ignoring user

这意味着在 mysqld 启动时或在它再次装载权限表时, 它在 user 表中找到了一个有一个无效口令的条目。 结果,条目简单地被权限系统忽略。 可能导致这个问题的原因和修正: 你可能正在运行一个有一个老的 user 表的新版本 mysqld。你可以通过执行 mysqlshow mysql user 看看口令字段是否少于 16 个字符来检查它。如果是这样,你可以通过运行 scripts/add_long_passwor d 脚本改正这种情况。 用户有一个老式的口令(8 个字符长)并且你没使用--old-protocol 选项启动 mysqld。用一个新口令更新 在 user 表中的用户或用--old-protocol 重启 mysqld。 你没有使用 PASSWORD()函数在在 user 表中指定了一个口令。使用 mysql 以一个新口令更新在 user 表中的用户。确保使用 PASSWORD()函数: mysql> update user set password=PASSWORD(’your password’) where user=’XXX’;

8. Table ’xxx’ doesn’t exist 错误 如果你得到错误 Table ’xxx’ doesn’t exist 或 Can’t find file: ’xxx’ (errno: 2),这意味着在当前数 据库中没有名为 xxx 的表存在。 注意,因为 MySQL 使用目录和文件存储数据库和表,数据库和表名件是区分大小写的!(在 Win32 上, 数据库和表名不是区分大小写的,但是在查询中对所有表的引用必须使用相同的大小写!) 你可以用 SHOW TABLES 检查你在当前数据库中有哪个表。 7.21 SHOW 句法(得到表、 见 列的信息) 。

9. MySQL 怎样处理一个溢出的磁盘 当出现一个磁盘溢出的情况时,MySQL 做下列事情: 它每分钟检查一次看是否有足够空间写入当前行。如果有足够的空间,它继续好像发生什么事情。 每 6 分钟它将有关磁盘溢出的警告写入日志文件。 为了缓和这个问题,你可以采取下列行动: 继续,你只需释放足够的空闲磁盘空间以便插入所有记录。 放弃线程,你必须发一个 mysqladmin kill 到线程。在下一次检查磁盘时,线程将被放弃(在 1 分钟内)。 注意,其他线程可能正在等待引起“磁盘溢出”条件的表。如果你有几个“锁定的”的线程,杀死正在等待磁 盘溢出条件的那个线程将允许其他线程继续。 10. 如何从一个文本文件运行 SQL 命令 一般地,mysql 客户被交互性地使用,象这样: shell> mysql database 然而,也可以把你的 SQL 命令放在一个文件中并且告诉 mysql 从该文件读取其输入。要想这样做,创造 一个文本文件“text_file”,它包含你想要执行的命令。然后如下那样调用 mysql: shell> mysql database < text_file 你也能启动有一个 USE db_name 语句的文本文件。在这种情况下,在命令行上指定数据库名是不必要 的: shell> mysql < text_file 11. MySQL 在哪儿存储临时文件 MySQL 使用 TMPDIR 环境变量的值作为存储临时文件的目录的路径名。如果你没有设置 TMPDIR,My

SQL 使用系统缺省值,它通常是“/tmp”或“/usr/tmp”。如果包含你的临时文件目录的文件系统太小,你 应该编辑 safe_mysqld 设定 TMPDIR 指向你有足够空间的一个文件系统!你也可以使用 mysqld 的--t mpdir 选项目设置临时目录。 MySQL 以“隐含文件”创建所有临时文件。这保证了如果 mysqld 被终止,临时文件也将被删除。使用隐 含文件的缺点是你将看不到一个大的临时文件填满了临时文件目录所在的文件系统。 当排序(ORDER BY 或 GROUP BY)时,MySQL 通常使用一个或两个临时文件。最大磁盘空间需求是: (存储东西的长度 + sizeof (数据库指针)) * 匹配的行数 * 2 sizeof(数据库指针)通常是 4,但是在未来对确实很大的表可能增加。 对一些 SELECT 查询,MySQL 也创建临时 SQL 表。这些没被隐含且有“SQL_*”格式的名字。 ALTER TABLE 和 OPTIMIZE TABLE 在原数据库表的同一个目录中创建一张临时表。 12. 怎样保护“/tmp/mysql.sock ”不被删除 如果你有这个问题,事实上任何人可以删除 MySQL 通讯套接字“/tmp/mysql.sock”,在 Unix 的大多数 版本上,你能通过为其设置 sticky(t)位来保护你的“/tmp”文件系统。作为 root 登录并且做下列事情: shell> chmod +t /tmp 这将保护你的“/tmp”文件系统使得文件仅能由他们的所有者或超级用户(root)删除。 你能执行 ls -ld /tmp 检查 sticky 位是否被设置,如果最后一位许可位是 t,该位被设置了。 13. Access denied 错误 见 6.6 权限系统如何工作。并且特别要看 6.13 引起 Access denied 错误的原因。 14. 怎样作为一个一般用户运行 MySQL MySQL 服务器 mysqld 能被任何用户启动并运行。 为了将 mysqld 改由 Unix 用户 user_name 来运行, 你必须做下列事情: 如果它正在运行,停止服务器(使用 mysqladmin shutdown)。 改变数据库目录和文件以便 user_name 有权限读和写文件(你可能需要作为 Unix 的 root 用户才能做到): shell> chown -R user_name /path/to/mysql/datadir 如果在 MySQL 数据目录中的目录或文件是符号链接,你也将需要顺着那些链接并改变他们指向的目录和 文件。chown -R 不能跟随符号链接。 以 user_name 用户启动服务器,或如果你正在使用 MySQL 3.22 或以后版本,以 Unix root 用户启动 mysqld 并使用--user=user_name 选项,mysqld 将在接受任何连接之前切换到以 Unix user_name 用户运行。 如果在系统被重新启动时,你使用 mysql.server 脚本启动 mysqld,你应该编辑 mysql.server 用 su 以 用户 user_name 运行 mysqld, 或使用--user 选项调用 mysqld。 (不改变 safe_mysqld 是必要的。 ) 现在,你的 mysqld 进程应该正在作为 Unix 用户 user_name 运行,并运行完好。尽管有一件事情没有 变化:权限表的内容。缺省 地(就在运行了脚本 mysql_install_db 安装的权限表后),MySQL 用户 root 是唯一有存取 mysql 数据库或创建或抛弃数据库权限的用户。 除非你改变了那些权限, 否则他们仍然保持。

当你作为一个 Unix 用户而不是 root 登录时,这不应该阻止你作为 MySQL root 用户来存取 MySQL;只 要为客户程序指定-u root 的选项。 注意通过在命令行上提供-u root,作为 root 存取 MySQL,与作为 Unix root 用户或其他 Unix 用户运 行 MySQL 没有关系。MySQL 的存取权限和用户名与 Unix 用户名字是完全分开的。唯一与 Unix 用户名 有关的是,如果当你调用一个客户程序时,你不提供一个-u 选项,客户将试图使用你的 Unix 登录名作为 你的 MySQL 用户名进行连接。 如果你的 Unix 机器本身不安全,你可能应该至少在存取表中为 MySQL root 用户放上一个口令。否则, 在那台机器上有一个帐号的任何用户能运行 mysql -u root db_name 并且做他喜欢做的任何事情。 15. 怎样重新设置一个忘记的口令 如果你忘记了 MySQL 的 root 用户的口令,你可以用下列过程恢复它。 通过发送一个 kill(不是 kill -9)到 mysqld 服务器来关闭 mysqld 服务器。pid 被保存在一个.pid 文件 中,通常在 MySQL 数据库目录中: kill `cat /mysql-data-directory/hostname.pid` 你必须是一个 UNIX root 用户或运行服务器的相同用户做这个。 使用--skip-grant-tables 选项重启 mysqld。 用 mysql -h hostname mysql 连接 mysqld 服务器并且用一条 GRANT 命令改变口令。见 7.26 GRA NT 和 REVOKE 句法。 你也可以用 mysqladmin -h hostname -u user password ’new password’ 进行。 用 mysqladmin -h hostname flush-privileges 或用 SQL 命令 FLUSH PRIVILEGES 来装载权限表。 16. 文件许可权限问题 如果你有与文件许可有关的问题,例如,如果当你创建一张表时,mysql 发出下列错误消息: ERROR: Can’t find file: ’path/with/filename.frm’ (Errcode: 13) 那么可能是在 mysqld 启动时,环境变量 UMASK 可能设置不正确。缺省的 umask 值是 0660。你可以 如下启动 safe_mysqld 改变其行为: shell> UMASK=384 # = 600 in octal shell> export UMASK shell> /path/to/safe_mysqld & 17. 文件没找到 如果你从 MySQL 得到 ERROR ’...’ not found (errno: 23), Can’t open file: ... (errno: 24)或任 何其他有 errno 23 或 errno 24 的错误,它意味着,你没有为 MySQL 分配足够的文件描述符。你能使 用 perror 实用程序得到错误号含义是什么的描述: shell> perror 23 File table overflow shell> perror 24 Too many open files 这里的问题是 mysqld 正在试图同时保持打开太多的文件。你也可以告诉 mysqld 一次不打开那么多的文 件,或增加 mysqld 可得到的文件描述符数量。为了告诉 mysqld 一次保持打开更少的文件,你可以通过 使用 safe_mysqld 的-O table_cache=32 选项(缺省值是 64)使表缓冲更小。减小 max_connection s 值也将减少打开文件的数量(缺省值是 90)。 要想改变 mysqld 可用的文件描述符数量,修改 safe_mysqld 脚本。脚本中有一条注释了的行 ulimit -

n 256。你可以删除’#’字符来去掉该行的注释,并且改变数字 256 改变为 mysqld 可用的文件描述符的 数量。 ulimit 能增加文件描述符的数量,但是只能到操作系统强加的限制。如果你需要增加每个进程可用的文件 描述符数量的 OS 限制,参见你的操作系统文档。注意,如果你运行 tcsh 外壳,ulimit 将不工作!当你请 求当前限制时,tcsh 也将报告不正确的值!在这种情况下,你应该用 sh 启动 safe_mysqld! 18. 使用 DATE 列的问题 一个 DATE 值的格式是’YYYY-MM-DD’。根据 ANSI SQL,不允许其他格式。你应该在 UPDATE 表达式 和 SELECT 语句的 WHERE 子句中使用这个格式。例如: mysql> SELECT * FROM tbl_name WHERE date >= ’1997-05-05’; 为了方便,如果日期用在数字上下文,MySQL 自动变换一个日期到一个数字(并且反过来也如此)。当更新 时和将一个日期与 TIMESTAMP、DATE 或 DATETIME 列比较的一个 WHERE 子句中,也是足够灵活以 允许一种“宽松”的字符串格式。(宽松格式意味着任何标点字符用作在部件之间的分割符。例如,’199808-15’和’1998#08#15’是等价的。MySQL 也能变换不包含分割符的一个字符串(例如 ’19980815’), ) 如果它作为一个日期说得通。特殊日期’0000-00-00’可以作为’0000-00-00’被存储和检索。当通过 My ODBC 使用一个’0000-00-00’日期时,在 MyODBC 2.50.12 和以上版本,它将自动被转换为 NULL, 因为 ODBC 不能处理这种日期。 因为 MySQL 实行了上述的变换,下列语句可以工作: mysql> INSERT INTO tbl_name (idate) VALUES (19970505); mysql> INSERT INTO tbl_name (idate) VALUES (’19970505’); mysql> INSERT INTO tbl_name (idate) VALUES (’97-05-05’); mysql> INSERT INTO tbl_name (idate) VALUES (’1997.05.05’); mysql> INSERT INTO tbl_name (idate) VALUES (’1997 05 05’); mysql> INSERT INTO tbl_name (idate) VALUES (’0000-00-00’); mysql> SELECT idate FROM tbl_name WHERE idate >= ’1997-05-05’; mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505; mysql> SELECT mod(idate,100) FROM tbl_name WHERE idate >= 19970505; mysql> SELECT idate FROM tbl_name WHERE idate >= ’19970505’; 然而,下列将不工作: mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,’19970505’)=0; STRCMP()是字符串函数,因此它将 idate 转换为一个字符串并且实施字符串比较。它不将’19970505’ 转换为一个日期并实施日期比较。 注意,MySQL 不检查日期是否正确。如果你存储一个不正确的日期,例如’1998-2-31’,错误的日期将被 存储。如果日期不能被变换到任何合理的值,在 DATE 字段中存储一个 0。这主要是一个速度问题并且我 们认为检查日期是应用程序的责任,而不服务器。 19. 时区问题 如果你有一个问题,SELECT NOW()以 GMT 时间返回值而不是你的本地时间,你必须设定 TZ 环境变量 为你的当前时区。这应该在服务器运行的环境进行,例如在 safe_mysqld 或 mysql.server 中。 20. 在搜索中的大小写敏感性 缺省地,MySQL 搜索是大小写不敏感的(尽管有一些字符集从来不是忽略大小写的,例如捷克语)。这意味

着,如果你用 col_name LIKE ’a%’搜寻,你将得到所有以 A 或 a 开始的列值。如果你想要使这个搜索 大小写敏感,使用象 INDEX(col_name, "A")=0 检查一个前缀。或如果列值必须确切是"A",使用 STR CMP(col_name, "A") = 0。 简单的比较操作(>=、>、= 、< 、<=、排序和聚合)是基于每个字符的“排序值”。有同样排序值的字符 (象 E,e 和’e)被视为相同的字符! LIKE 比较在每个字符的大写值上进行(E==e 但是 E<>’e)。 如果你想要一个列总是被当作大小写敏感的方式,声明它为 BINARY。见 7.7 CREATE TABLE 句法。 如果你使用以所谓的 big5 编码的中文数据,你要使所有的字符列是 BINARY,它可行,是因为 big5 编码 字符的排序顺序基于 ASCII 代码的顺序。 21. NULL 值问题 NULL 值的概念是造成 SQL 的新手的混淆的普遍原因,他们经常认为 NULL 是和一个空字符串’’的一样的 东西。不是这样的!例如,下列语句是完全不同的: mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES (""); 两个语句把值插入到 phone 列,但是第一个插入一个 NULL 值而第二个插入一个空字符串。第一个的含 义可以认为是“电话号码不知道”,而第二个则可意味着“她没有电话”。 在 SQL 中,NULL 值在于任何其他值甚至 NULL 值比较时总是假的(FALSE)。包含 NULL 的一个表达 式总是产生一个 NULL 值,除非在包含在表达式中的运算符和函数的文档中指出。在下列例子,所有的列 返回 NULL: mysql> SELECT NULL,1+NULL,CONCAT(’Invisible’,NULL); 如果你想要寻找值是 NULL 的列, 你不能使用=NULL 测试。 下列语句不返回任何行, 因为对任何表达式, expr = NULL 是假的: mysql> SELECT * FROM my_table WHERE phone = NULL; 要想寻找 NULL 值,你必须使用 IS NULL 测试。下例显示如何找出 NULL 电话号码和空的电话号码: mysql> SELECT * FROM my_table WHERE phone IS NULL; mysql> SELECT * FROM my_table WHERE phone = ""; 在 MySQL 中,就像很多其他的 SQL 服务器一样,你不能索引可以有 NULL 值的列。你必须声明这样的列 为 NOT NULL,而且,你不能插入 NULL 到索引的列中。当用 LOAD DATA INFILE 读取数据时,空列 用’’更新。如果你想要在一个列中有 NULL 值,你应该在文本文件中使用 N。字面词’NULL’也可以在某些 情形下使用。见

22. LOAD DATA INFILE 句法。当使用 ORDER BY 时,首先呈现 NULL 值。如果你用 DESC 以降序排 序,NULL 值最后显示。当使用 GROUP BY 时,所有的 NULL 值被认为是相等的。为了有助于 NULL 的 处理,你能使用 IS NULL 和 IS NOT NULL 运算符和 IFNULL()函数。 对某些列类型,NULL 值被特殊地处理。如果你将 NULL 插入表的第一个 TIMESTAMP 列,则插入当前的 日期和时间。如果你将 NULL 插入一个 AUTO_INCREMENT 列,则插入顺序中的下一个数字。

23. alias 问题 你可以在 GROUP BY、ORDER BY 或在 HAVING 部分中使用别名引用列。别名也可以用来为列取一个 更好点的名字: SELECT SQRT(a*b) as rt FROM table_name GROUP BY rt HAVING rt > 0; SELECT id,COUNT(*) AS cnt FROM table_name GROUP BY id HAVING cnt > 0; SELECT id AS "Customer identity" FROM table_name; 注意,你的 ANSI SQL 不允许你在一个 WHERE 子句中引用一个别名。这是因为在 WHERE 代码被执行 时,列值还可能没有终结。例如下列查询是不合法:SELECT id,COUNT(*) AS cnt FROM table_na me WHERE cnt > 0 GROUP BY id; WHERE 语句被执行以确定哪些行应该包括 GROUP BY 部分中, HAVING 用来决定应该只用结果集合 而 中的哪些行。 24. 从关联的表中删除行 因为 MySQL 不支持子选择或在 DELETE 语句中使用多个表, 你应该使用下列方法从 2 个关联的表中删除 行: 在主表中基于某个 WHERE 条件 SELECT 行。 在主表中基于相同的条件 DELETE 行。 DELETE FROM related_table WHERE related_column IN (selected_rows) 如果在 related_column 查询中的字符的全部数量超过 1,048,576(缺省值 max_allowed_packet), 你应该分成更小的部分并且执行多个 DELETE 语句。如果 related_column 是一个索引,你每次只删除 1 00-1000 个 related_column id 将可能使得 DELETE 最快。如果 related_column 不是一个索引,速 度与 IN 子句中参数的数量无关。 25. 解决没有匹配行的问题 如果你有一个复杂的查询,涉及多个表,但没有返回任何行,你应该使用下列过程查找你的询问有什么不 对: EXPLAIN 测试查询并且检查你是否能找出显然是错误的一些东西。 7.22 EXPLAIN 句法(得到关于一个 见 SELECT 的信息)。 仅选择那些在 WHERE 子句中使用的字段。 一次从查询中删除一个表,直到它返回一些行。如果表很大,对查询使用 LIMIT 10 是一个好主意。 对应该已经匹配一行的列做一个 SELECT,针对从询问中做后被删除的表。 如果你将 FLOAT 或 DOUBLE 列与有小数的数字进行比较, 你不能使用=!。 这个问题在大多数计算机语言 是常见的,因为浮点值不是准确的值。 mysql> SELECT * FROM table_name WHERE float_column=3.5; -> mysql> SELECT * FROM table_name WHERE float_column between 3.45 and 3.55; 在大多数情况下,将 FLOAT 改成一个 DOUBLE 将修正它! 如果你仍然不能发现错误是什么, 创建一个最小的可运行 mysql test < query.sql 的测试来显示你的问 题。你可以用 mysqldump --quick database tables > query.sql 创建一个测试文件,在一个编辑器 编辑文件, 删除一些插入行(如果有太多这些语句)并且在文件末尾加入你的选择语句。 测试你仍然有问题, 可以这样做: shell> mysqladmin create test2

shell> mysql test2 < query.sql 使用 mysqlbug 的邮寄测试文件到 mysql@lists.mysql.com。 26. 与 ALTER TABLE 有关的问题 如果 ALTER TABLE 死于这样一个错误: Error on rename of ’./database/name.frm’ to ’./database/B-a.frm’ (Errcode: 17) 问题可能是 MySQL 在前一个 ALTER TABLE 中已经崩溃并且留下了一个名为“A-xxx”或“B-xxx”的老的 数据库表。在这种情况下,到 MySQL 数据目录中并删除所有名字以 A-或 B-开始的文件。(你可以把他 们移到别的地方而不是删除他们)。 ALTER TABLE 工作方式是: 以要求的改变创建一个名为“A-xxx”的新表。 从老表把所有行拷贝到“A-xxx”。 老表被改名为“B-xxx”。 “A-xxx”被改名为你的老表的名字。 “B-xxx”被删除。 如果某些改名操作出错,MySQL 试图还原改变。如果出错严重(当然,这不应该发生。),MySQL 可能留 下了老表为“B-xxx”但是一个简单改名就应该恢复你的数据。

27. 怎样改变一张表中列的顺序 SQL 的要点是中抽象应用程序以避免数据存储格式。 你应该总是以你想要检索数据的意愿指定顺序。 例如: SELECT col_name1, col_name2, col_name3 FROM tbl_name; 将以 col_name1、col_name2、col_name3 的顺序返回列,而: SELECT col_name1, col_name3, col_name2 FROM tbl_name; 将以 col_name1、col_name3、col_name2 的顺序返回列。 在一个应用程序中,你应该决不基于他们的位置使用 SELECT * 检索列,因为被返回的列的顺序永远不 能保证;对你的数据库的一个简单改变可能导致你的应用程序相当有戏剧性地失败。 不管怎样,如果你想要改变列的顺序,你可以这样做: 以正确的列顺序创建一张新表。 执行 INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table. 删除或改名 old_table。 ALTER TABLE new_table RENAME old_table。

18.2.1 MySQL server has gone away 错误 本小节也涉及有关 Lost connection to server during query 的错误。 对 MySQL server has gone away 错误最常见的原因是服务器超时了并且关闭了连接。缺省地,

如果没有事情发生, 服务器在 8 个小时后关闭连接。 你可在启动 mysqld 时通过设置 wait_timeout 变量改变时间限制。 你可以通过执行 mysqladmin version 并且检验正常运行的时间来检查 MySQL 还没死掉。 如果你有一个脚本,你只须再发出查询让客护进行一次自动的重新连接。 在这种请下,你通常能获得下列错误代码(你得到的是 OS 相关的): CR_SERVER_GONE_ERROR 客户不能发送一个问题给服务器。 CR_SERVER_LOST 当写服务器时, 客户没有出错, 但是它没有得到对问题的一个完整的答案(或任 何答案)。 如果你向服务器发送不正确的或太大的查询,你也可能得到这些错误。如果 mysqld 得到一个太 大或不正常的包,它认为客户出错了并关闭连接。如果你需要较 大的查询(例如,如果你正在处 理较大的 BLOB 列),你可以使用-O max_allowed_packet=#选项(缺省 1M)启动 mysqld 以增加查 询限制。多余的内存按需分配,这样 mysqld 只有在你发出较大差询 时或 mysqld 必须返回较大 的结果行时,才使用更多的内存! 18.2.2 Can’t connect to [local] MySQL server 错误 一个 MySQL 客户可以两种不同的方式连接 mysqld 服务器:Unix 套接字,它通过在文件系统中的 一个文件(缺省 “/tmp/mysqld.sock”)进行连接;或 TCP/IP,它通过一个端口号连接。Unix 套接字比 TCP/IP 更快, 但是只有用在连接同一台计 算机上的服务器。 如果你不指定主机名或如 果你指定特殊的主机名 localhost,使用 Unix 套接字。 错误(2002)Can’t connect to ?通常意味着没有一个 MySQL 服务器运行在系统上或当试图连 接 mysqld 服务器时,你正在使用一个错误的套接字文件或 TCP/IP 端口。 由检查(使用 ps)在你的服务器上有一个名为 mysqld 的进程启动!如果没有任何 mysqld 过程, 你应该启动一个。见 4.15.2 启动 MySQL 服务器的问题。 如果一个 mysqld 过程正在运行, 你可以通过尝试这些不同的连接来检查服务器(当然, 端口号和 套接字路径名可能在你的安装中是不同的): shell> mysqladmin version shell> mysqladmin variables shell> mysqladmin -h `hostname` version variables shell> mysqladmin -h `hostname` –port=3306 version shell> mysqladmin -h ’ip for your host’ version shell> mysqladmin –socket=/tmp/mysql.sock version 注意 hostname 命令使用反引号“`”而非正引号“’”;这些导致 hostname 输出(即,当前主 机名)被代替进 mysqladmin 命令中。 这是可能造成 Can’t connect to local MySQL server 错误的一些原因: mysqld 不在运行。 你正在使用 MIT-pthreads 的一个系统上运行。如果正在运行在一个没有原生线程的系统上, mysqld 使用 MIT-pthreads 软件包。见 4.2 由 MySQL 支持的操作系统。然而,MIT-pthreads 不支持 Unix 套接字, 因此当与服务器连接时, 在这样一个系统上, 你总是必须明确地指定主机 名。 试试使用这个命令检查到服务器的连接: shell> mysqladmin -h `hostname` version 某人删除了 mysqld 使用的 Unix 套接字(缺省“/tmp/mysqld.sock”)。你可能有一个 cron 任务 删除了 MySQL 套接字(例如,一 个把旧文件从“/tmp”目录中删除的任务)。你总是可以运行

mysqladmin version 并且检查 mysqladmin 正在试图使用的套接字确实存在。在这种情况下,修 复方法是删除 cron 任务而不删除“mysqld.sock 或将套接字放在其他地方。你能用这个命令在 MySQL 配置时指定一个不同的套接字地点: shell> ./configure –with-unix-socket-path=/path/to/socket 你也可以使用–socket=/path/to/socket 选项启动 safe_mysqld 和在启动你的 MySQL 客户前设 置环境变量 MYSQL_UNIX_PORT 为套接字路径名。你可用–socket=/path/to/socket 选项启动 mysqld 服务器。如果你改变了服务 器的套接字路径名,你也必须通知 MySQL 客户关于新路径的 情况。你可以通过设置环境变量 MYSQL_UNIX_PORT 为套接字路径名或由提供套接字路 径名作为 客户的参数做到。你可用这个命令测试套接字: shell> mysqladmin –socket=/path/to/socket version 你正在使用 Linux 和线程已经死了(核心倾倒了)。在这种情况中,你必须杀死其它 mysqld 线程 (例如在启动一个新的 MySQL 服务器之前,可以用 mysql_zap 脚本)。见 18.1 如果 MySQL 总是 崩溃怎么办。 如果你得到错误 Can’t connect to MySQL server on some_hostname,你可以尝试下列步骤找 出问题是什么: 通过执行 telnet your-host-name tcp-ip-port-number 并且按几次回车来检查服务器是否正常 运行。如果有一个 MySQL 运行在这个端口上,你应该得到一个包含正在运行的 MySQL 服务器的 版本号的应答。如果你得到类似于 telnet: Unable to connect to remote host: Connection refused 的一个错误,那么没有服务器在使用的端口上运行。 尝试连接本地机器上的 mysqld 守护进程,并用 mysqladmin variables 检查 mysqld 被配置使用 的 TCP/IP 端口(变量 port)。 检查你的 mysqld 服务器没有用–skip-networking 选项启动。 18.2.3 Host ’?’ is blocked 错误 如果你得到象这样的一个错误: Host ’hostname’ is blocked because of many connection errors. Unblock with ’mysqladmin flush-hosts’ 这意味着,mysqld 已经得到了大量(max_connect_errors)的主机’hostname’的在中途被中断 了的连接请求。在 max_connect_errors 次失败请求后,mysqld 认定出错了(象来字一个黑客的 攻击),并且阻止该站点进一步的连接,直到某人执行命令 mysqladmin flush-hosts。 缺省地,mysqld 在 10 个连接错误后阻塞一台主机。你可以通过象这样启动服务器很容易地调整 它: shell> safe_mysqld -O max_connect_errors=10000 & 注意,对给定的主机,如果得到这条错误消息,你应该首先检查该主机的 TCP/IP 连接有没有问 题。如果你的 TCP/IP 连接不在运行,增加 max_connect_errors 变量的值对你也不会有帮助! 18.2.4 Too many connections 错误 如果在你试土连接 MySQL 时,你得到错误 Too many connections,这意味着已经有 max_connections 个客户连接了 mysqld 服务器。 如果你需要比缺省(100)更多的连接,那么你应该重启 mysqld,用更大的 max_connections 变 量值。 注意,mysqld 实际上允许(max_connections+1)个客户连接。最后一个连接是为一个用 Process

权限的用户保留的。通过不把这个 权限给一般用户(他们不应该需要它),有这个权限一个管理 员可以登录并且使用 SHOW PROCESSLIST 找出什么可能出错。见 7.21 SHOW 句法 (得到表,列的 信息)。 18.2.5 Out of memory 错误 如果你发出查询并且得到类似于下面的错误: mysql: Out of memory at line 42, ’malloc.c’ mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k) ERROR 2008: MySQL client ran out of memory 注意,错误指向了 MySQL 客户 mysql。这个错误的原因很简单,客户没有足够的内存存储全部结 果。 为了修正这个问题,首先检查你的查询是否正确。它应该返回这么多的行,这合理吗?如果是这 样,你可以使用 mysql –quick,它使用 mysql_use_result()检索结果集合。这将较少的负担放 在了客户端(只是服务器更多)。 18.2.6 Packet too large 错误 当一个 MySQL 客户或 mysqld 服务器得到一个比 max_allowed_packet 个字节长的包, 它发出一个 Packet too large 错误并终止连接。 如果你正在使用 mysql 客户,你可以通过用 mysql –set-variable=max_allowed_packet=8M 指 定一个更大的缓冲区来启动客户程序。 如果你正在使用不允许你指定最大包大小的其他客户(例如 DBI), 你需要在你启动服务器时设置 包大小。 你可以使用 mysqld 的命令行选项设置 max_allowed_packet 为一个更大的尺寸。 例如, 如果你正期望将一个全长的 BLOB 存入一张表中,你将需要用–set-variable =max_allowed_packet=24M 选项来启动服务器。 18.2.7 The table is full 错误 这个错误发生在内存临时表变得比 tmp_table_size 字节大时。为了避免这个问题,你可以使用 mysqld 的-O tmp_table_size= #选项来增加临时表的大小,或在你发出有疑问的查询之前使用 SQL 选项 SQL_BIG_TABLES。见 7.25 SET OPTION 句法。 你也可以使用–big-tables 选项启动 mysqld。这与为所有查询使用 SQL_BIG_TABLES 完全相同。 18.2.8 Commands out of sync in client 错误 如果你在你的客户代码中得到 Commands out of sync; You can’t run this command now,你 正在以错误的次序调用客户函数! 这可能发生,例如,如果你正在使用 mysql_use_result()并且在你已经调用了 mysql_free_result()之前试图执行新查询。 如果你在 mysql_use_result()或 mysql_store_result()之间试图执行返回数据的 2 个查询,它也可能发生。 18.2.9 Ignoring user 错误 如果你得到下列错误: Found wrong password for user: ’some_user@some_host’; Ignoring user 这意味着在 mysqld 启动时或在它再次装载权限表时, 它在 user 表中找到了一个有一个无效口令 的条目。结果,条目简单地被权限系统忽略。 可能导致这个问题的原因和修正: 你可能正在运行一个有一个老的 user 表的新版本 mysqld。 你可以通过执行 mysqlshow mysql user

看看口令字段是否少于 16 个字符来检查它。如果是这样,你可以通过运行 scripts/add_long_password 脚本改正这种情况。 用户有一个老式的口令(8 个字符长)并且你没使用–old-protocol 选项启动 mysqld。用一个新 口令更新在 user 表中的用户或用–old-protocol 重启 mysqld。 你没有使用 PASSWORD()函数在在 user 表中指定了一个口令。使用 mysql 以一个新口令更新在 user 表中的用户。确保使用 PASSWORD()函数: mysql> update user set password=PASSWORD(’your password’) where user=’XXX’; 18.2.10 Table ’xxx’ doesn’t exist 错误 如果你得到错误 Table ’xxx’ doesn’t exist 或 Can’t find file: ’xxx’ (errno: 2), 这意味着在当前数据库中没有名为 xxx 的表存在。 注意, 因为 MySQL 使用目录和文件存储数据库和表, 数据库和表名件是区分大小写的! (在 Win32 上,数据库和表名不是区分大小写的,但是在查询中对所有表的引用必须使用相同的大小写!) 你可以用 SHOW TABLES 检查你在当前数据库中有哪个表。 7.21 SHOW 句法(得到表、 见 列的信息) 。 18.3 MySQL 怎样处理一个溢出的磁盘 当出现一个磁盘溢出的情况时,MySQL 做下列事情: 它每分钟检查一次看是否有足够空间写入当前行。 如果有足够的空间, 它继续好像发生什么事情。 每 6 分钟它将有关磁盘溢出的警告写入日志文件。 为了缓和这个问题,你可以采取下列行动: 继续,你只需释放足够的空闲磁盘空间以便插入所有记录。 放弃线程,你必须发一个 mysqladmin kill 到线程。在下一次检查磁盘时,线程将被放弃(在 1 分钟内)。 注意,其他线程可能正在等待引起“磁盘溢出”条件的表。如果你有几个“锁定的”的线程,杀 死正在等待磁盘溢出条件的那个线程将允许其他线程继续。 18.4 如何从一个文本文件运行 SQL 命令 一般地,mysql 客户被交互性地使用,象这样: shell> mysql database 然而, 也可以把你的 SQL 命令放在一个文件中并且告诉 mysql 从该文件读取其输入。 要想这样做, 创造一个文本文件“text_file”,它包含你想要执行的命令。然后如下那样调用 mysql: shell> mysql database < text_file 你也能启动有一个 USE db_name 语句的文本文件。在这种情况下,在命令行上指定数据库名是不 必要的: shell> mysql < text_file 见 12.1 不同的 MySQL 程序概述。 18.5 MySQL 在哪儿存储临时文件 MySQL 使用 TMPDIR 环境变量的值作为存储临时文件的目录的路径名。如果你没有设置 TMPDIR, MySQL 使用系统缺省值,它通常是“/tmp”或 “/usr/tmp”。如果包含你的临时文件目录的文 件系统太小, 你应该编辑 safe_mysqld 设定 TMPDIR 指向你有足够空间的一个文件系统! 也可 你 以使用 mysqld 的–tmpdir 选项目设置临时目录。 MySQL 以“隐含文件”创建所有临时文件。 这保证了如果 mysqld 被终止, 临时文件也将被删除。

使用隐含文件的缺点是你将看不到一个大的临时文件填满了临时文件目录所在的文件系统。 当排序(ORDER BY 或 GROUP BY)时,MySQL 通常使用一个或两个临时文件。最大磁盘空间需求是: (存储东西的长度 + sizeof (数据库指针)) * 匹配的行数 * 2 sizeof(数据库指针)通常是 4,但是在未来对确实很大的表可能增加。 对一些 SELECT 查询,MySQL 也创建临时 SQL 表。这些没被隐含且有“SQL_*”格式的名字。 ALTER TABLE 和 OPTIMIZE TABLE 在原数据库表的同一个目录中创建一张临时表。 18.6 怎样保护“/tmp/mysql.sock ”不被删除 如果你有这个问题,事实上任何人可以删除 MySQL 通讯套接字“/tmp/mysql.sock”,在 Unix 的大多数版本上,你能通过为其设置 sticky(t)位来保护你的“/tmp”文件系统。作为 root 登录并且做下列事情: shell> chmod +t /tmp 这将保护你的“/tmp”文件系统使得文件仅能由他们的所有者或超级用户(root)删除。 你能执行 ls -ld /tmp 检查 sticky 位是否被设置,如果最后一位许可位是 t,该位被设置了。 18.7 Access denied 错误 见 6.6 权限系统如何工作。并且特别要看 6.13 引起 Access denied 错误的原因。 18.8 怎样作为一个一般用户运行 MySQL MySQL 服务器 mysqld 能被任何用户启动并运行。为了将 mysqld 改由 Unix 用户 user_name 来运 行,你必须做下列事情: 如果它正在运行,停止服务器(使用 mysqladmin shutdown)。 改变数据库目录和文件以便 user_name 有权限读和写文件(你可能需要作为 Unix 的 root 用户才 能做到): shell> chown -R user_name /path/to/mysql/datadir 如果在 MySQL 数据目录中的目录或文件是符号链接, 你也将需要顺着那些链接并改变他们指向的 目录和文件。chown -R 不能跟随符号链接。 以 user_name 用户启动服务器,或如果你正在使用 MySQL 3.22 或以后版本,以 Unix root 用户 启动 mysqld 并使用–user=user_name 选项,mysqld 将在接受任何连接之前切换到以 Unix user_name 用户运行。 如果在系统被重新启动时,你使用 mysql.server 脚本启动 mysqld,你应该编辑 mysql.server 用 su 以用户 user_name 运行 mysqld,或使用–user 选项调用 mysqld。(不改变 safe_mysqld 是必要的。) 现在,你的 mysqld 进程应该正在作为 Unix 用户 user_name 运行,并运行完好。尽管有一件事情 没有变化: 权限表的内容。 缺省 地(就在运行了脚本 mysql_install_db 安装的权限表后), MySQL 用户 root 是唯一有存取 mysql 数据库或创建或抛弃数据库权限的用 户。 除非你改变了那些权限, 否则他们仍然保持。 当你作为一个 Unix 用户而不是 root 登录时, 这不应该阻止你作为 MySQL root 用户来存取 MySQL;只要为客户程序指定-u root 的选项。 注意通过在命令行上提供-u root,作为 root 存取 MySQL,与作为 Unix root 用户或其他 Unix 用户运行 MySQL 没有关系。MySQL 的存取权限和用户名与 Unix 用户名字是完全分开的。唯一与 Unix 用户名有关的是,如果当你调用一个客 户程序时,你不提供一个-u 选项,客户将试图使用

你的 Unix 登录名作为你的 MySQL 用户名进行连接。 如果你的 Unix 机器本身不安全,你可能应该至少在存取表中为 MySQL root 用户放上一个口令。 否则,在那台机器上有一个帐号的任何用户能运行 mysql -u root db_name 并且做他喜欢做的任 何事情。 18.9 怎样重新设置一个忘记的口令 如果你忘记了 MySQL 的 root 用户的口令,你可以用下列过程恢复它。 通过发送一个 kill 不是 kill -9)到 mysqld 服务器来关闭 mysqld 服务器。 ( pid 被保存在一个.pid 文件中,通常在 MySQL 数据库目录中: kill `cat /mysql-data-directory/hostname.pid` 你必须是一个 UNIX root 用户或运行服务器的相同用户做这个。 使用–skip-grant-tables 选项重启 mysqld。 用 mysql 行。 用 mysqladmin -h hostname flush-privileges 或用 SQL 命令 FLUSH PRIVILEGES 来装载权限表。 18.10 文件许可权限问题 如果你有与文件许可有关的问题,例如,如果当你创建一张表时,mysql 发出下列错误消息: ERROR: Can’t find file: ’path/with/filename.frm’ (Errcode: 13) 那么可能是在 mysqld 启动时,环境变量 UMASK 可能设置不正确。缺省的 umask 值是 0660。你可 以如下启动 safe_mysqld 改变其行为: shell> UMASK=384 # = 600 in octal shell> export UMASK shell> /path/to/safe_mysqld & 18.11 文件没找到 如果你从 MySQL 得到 ERROR ’?’ not found (errno: 23), Can’t open file: ? 述符。你能使用 perror 实用程序得到错误号含义是什么的描述: shell> perror 23 File table overflow shell> perror 24 Too many open files 这里的问题是 mysqld 正在试图同时保持打开太多的文件。 你也可以告诉 mysqld 一次不打开那么 多的文件,或增加 mysqld 可得到的文件描述符数 量。为了告诉 mysqld 一次保持打开更少的文 件,你可以通过使用 safe_mysqld 的-O table_cache=32 选项(缺省值是 64)使表缓冲更小。减 小 max_connections 值也将减少打开文件的数量(缺省值是 90)。 要想改变 mysqld 可用的文件描述符数量,修改 safe_mysqld 脚本。脚本中有一条注释了的行 ulimit -n 256。你可以删除’#’字符来去掉该行的注释,并且改变数字 256 改变为 mysqld 可 用的文件描述符的数量。 ulimit 能增加文件描述符的数量,但是只能到操作系统强加的限制。如果你需要增加每个进程 可用的文件描述符数量的 OS 限制, 参见你的操作系统文档。 注意, 如果你运 行 tcsh 外壳, ulimit (errno: 24)或任何其他有 errno 23 或 errno 24 的错误,它意味着,你没有为 MySQL 分配足够的文件描 -h hostname mysql 连接 mysqld 服务器并且用一条 GRANT 命令改变口令。 7.26 GRANT 见 和 REVOKE 句法。你也可以用 mysqladmin -h hostname -u user password ’new password’ 进

将不工作!当你请求当前限制时,tcsh 也将报告不正确的值!在这种情况下,你应该用 sh 启动 safe_mysqld! 18.12 使用 DATE 列的问题 一个 DATE 值的格式是’YYYY-MM-DD’。根据 ANSI SQL,不允许其他格式。你应该在 UPDATE 表 达式和 SELECT 语句的 WHERE 子句中使用这个格式。例如: mysql> SELECT * FROM tbl_name WHERE date >= ’1997-05-05’; 为了方便, 如果日期用在数字上下文, MySQL 自动变换一个日期到一个数字(并且反过来也如此)。 当更新时和将一个日期与 TIMESTAMP、DATE 或 DATETIME 列比较的一个 WHERE 子句中,也是足够 灵活以允许一种“宽松”的字符串格式。 (宽松格式意味着任何标点字符用作在部件之间的分割 符。例 如,’1998-08-15’和’1998#08#15’是等价的。)MySQL 也能变换不包含分割符的一 个字符串(例如 ’19980815’),如果它作为一个日期说得通。特殊日期’0000-00-00’可以作 为’0000-00-00’被存储和检索。当通过 MyODBC 使用一个’0000-00- 00’日期时,在 MyODBC 2.50.12 和以上版本,它将自动被转换为 NULL,因为 ODBC 不能处理这种日期。 因为 MySQL 实行了上述的变换,下列语句可以工作: mysql> INSERT INTO tbl_name (idate) VALUES (19970505); mysql> INSERT INTO tbl_name (idate) VALUES (’19970505’); mysql> INSERT INTO tbl_name (idate) VALUES (’97-05-05’); mysql> INSERT INTO tbl_name (idate) VALUES (’1997.05.05’); mysql> INSERT INTO tbl_name (idate) VALUES (’1997 05 05’); mysql> INSERT INTO tbl_name (idate) VALUES (’0000-00-00’); mysql> SELECT idate FROM tbl_name WHERE idate >= ’1997-05-05’; mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505; mysql> SELECT mod(idate,100) FROM tbl_name WHERE idate >= 19970505; mysql> SELECT idate FROM tbl_name WHERE idate >= ’19970505’; 然而,下列将不工作: mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,’19970505’)=0; STRCMP()是字符串函数,因此它将 idate 转换为一个字符串并且实施字符串比较。它不 将’19970505’转换为一个日期并实施日期比较。 注意,MySQL 不检查日期是否正确。如果你存储一个不正确的日期,例如’1998-2-31’,错误 的日期将被存储。如果日期不能被变换到任何合理的值,在 DATE 字段中存储一个 0。这主要是 一个速度问题并且我们认为检查日期是应用程序的责任,而不服务器。 18.13 时区问题 如果你有一个问题,SELECT NOW()以 GMT 时间返回值而不是你的本地时间,你必须设定 TZ 环境 变量为你的当前时区。这应该在服务器运行的环境进行,例如在 safe_mysqld 或 mysql.server 中。 18.14 在搜索中的大小写敏感性 缺省地, MySQL 搜索是大小写不敏感的(尽管有一些字符集从来不是忽略大小写的, 例如捷克语)。 这意味着,如果你用 col_name LIKE ’a%’ 搜寻,你将得到所有以 A 或 a 开始的列值。如果你 想要使这个搜索大小写敏感,使用象 INDEX(col_name, “A”)=0 检查一个前缀。或如果列值必

须确切是”A”,使用 STRCMP(col_name, “A”) = 0。 简单的比较操作(>=、>、= 、< 、<=、排序和聚合)是基于每个字符的“排序值”。有同样排序 值的字符(象 E,e 和’e)被视为相同的字符! LIKE 比较在每个字符的大写值上进行(E==e 但是 E<>’e)。 如果你想要一个列总是被当作大小写敏感的方式, 声明它为 BINARY。 7.7 CREATE TABLE 句法。 见 如果你使用以所谓的 big5 编码的中文数据, 你要使所有的字符列是 BINARY, 它可行, 是因为 big5 编码字符的排序顺序基于 ASCII 代码的顺序。 18.15 NULL 值问题 NULL 值的概念是造成 SQL 的新手的混淆的普遍原因, 他们经常认为 NULL 是和一个空字符串’’ 的一样的东西。不是这样的!例如,下列语句是完全不同的: mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES (“”); 两个语句把值插入到 phone 列,但是第一个插入一个 NULL 值而第二个插入一个空字符串。第一 个的含义可以认为是“电话号码不知道”,而第二个则可意味着“她没有电话”。 在 SQL 中,NULL 值在于任何其他值甚至 NULL 值比较时总是假的(FALSE)。包含 NULL 的一个表 达式总是产生一个 NULL 值, 除非在包含在表达式中的运算符和函数的文档中指出。 在下列例子, 所有的列返回 NULL: mysql> SELECT NULL,1+NULL,CONCAT(’Invisible’,NULL); 如果你想要寻找值是 NULL 的列,你不能使用=NULL 测试。下列语句不返回任何行,因为对任何 表达式,expr = NULL 是假的: mysql> SELECT * FROM my_table WHERE phone = NULL; 要想寻找 NULL 值, 你必须使用 IS NULL 测试。 下例显示如何找出 NULL 电话号码和空的电话号码: mysql> SELECT * FROM my_table WHERE phone IS NULL; mysql> SELECT * FROM my_table WHERE phone = “”; 在 MySQL 中,就像很多其他的 SQL 服务器一样,你不能索引可以有 NULL 值的列。你必须声明这 样的列为 NOT NULL,而且,你不能插入 NULL 到索引的列中。当用 LOAD DATA INFILE 读取数据 时,空列用’’更新。如果你想要在一个列中有 NULL 值,你应该在文本文件中使用\N。字面 词’NULL’ 也可以在某些情形下使用。见 7.16 LOAD DATA INFILE 句法。当使用 ORDER BY 时, 首先呈现 NULL 值。如果你用 DESC 以降序排序,NULL 值最后显示。当使用 GROUP BY 时,所有的 NULL 值被认为是相等的。为了有助于 NULL 的处理,你能使用 IS NULL 和 IS NOT NULL 运算符和 IFNULL()函数。 对某些列类型,NULL 值被特殊地处理。如果你将 NULL 插入表的第一个 TIMESTAMP 列,则插入当 前的日期和时间。如果你将 NULL 插入一个 AUTO_INCREMENT 列,则插入顺序中的下一个数字。 18.16 alias 问题 你可以在 GROUP BY、ORDER BY 或在 HAVING 部分中使用别名引用列。别名也可以用来为列取一个 更好点的名字: SELECT SQRT(a*b) as rt FROM table_name GROUP BY rt HAVING rt > 0; SELECT id,COUNT(*) AS cnt FROM table_name GROUP BY id HAVING cnt > 0; SELECT id AS “Customer identity” FROM table_name;

注意,你的 ANSI SQL 不允许你在一个 WHERE 子句中引用一个别名。这是因为在 WHERE 代码被执 行时,列值还可能没有终结。例如下列查询是不合法:SELECT id,COUNT(*) AS cnt FROM table_name WHERE cnt > 0 GROUP BY id;

WHERE 语句被执行以确定哪些行应该包括 GROUP BY 部分中,而 HAVING 用来决定应该只用结果集 合中的哪些行。 18.17 从关联的表中删除行 因为 MySQL 不支持子选择或在 DELETE 语句中使用多个表,你应该使用下列方法从 2 个关联的表 中删除行: 在主表中基于某个 WHERE 条件 SELECT 行。 在主表中基于相同的条件 DELETE 行。 DELETE FROM related_table WHERE related_column IN (selected_rows) 如果在 related_column 查询中的字符的全部数量超过 1,048,576(缺省值 max_allowed_packet) , 你应该分成更小的部 分并且执行多个 DELETE 语句。如果 related_column 是一个索引,你每次 只删除 100-1000 个 related_column id 将可能使得 DELETE 最快。如果 related_column 不是一 个索引,速度与 IN 子句中参数的数量无关。 18.18 解决没有匹配行的问题 如果你有一个复杂的查询,涉及多个表,但没有返回任何行,你应该使用下列过程查找你的询问 有什么不对: EXPLAIN 测试查询并且检查你是否能找出显然是错误的一些东西。见 7.22 EXPLAIN 句法(得到关 于一个 SELECT 的信息)。 仅选择那些在 WHERE 子句中使用的字段。 一次从查询中删除一个表,直到它返回一些行。如果表很大,对查询使用 LIMIT 10 是一个好主 意。 对应该已经匹配一行的列做一个 SELECT,针对从询问中做后被删除的表。 如果你将 FLOAT 或 DOUBLE 列与有小数的数字进行比较,你不能使用=!。这个问题在大多数计算 机语言是常见的,因为浮点值不是准确的值。 mysql> SELECT * FROM table_name WHERE float_column=3.5; -> mysql> SELECT * FROM table_name WHERE float_column between 3.45 and 3.55; 在大多数情况下,将 FLOAT 改成一个 DOUBLE 将修正它! 如果你仍然不能发现错误是什么,创建一个最小的可运行 mysql test < query.sql 的测试来显 示你的问题。你可以用 mysqldump –quick database tables > query.sql 创建一个测试文件, 在一个编辑器编辑文件, 删除一些插入行(如果有太多这些语句)并且在文件末尾加入你的选择语 句。测试你仍然有问题, 可以这样做: shell> mysqladmin create test2 shell> mysql test2 < query.sql 使用 mysqlbug 的邮寄测试文件到 mysql@lists.mysql.com。 18.19 与 ALTER TABLE 有关的问题 如果 ALTER TABLE 死于这样一个错误: Error on rename of ’./database/name.frm’ to ’./database/B-a.frm’ (Errcode: 17)

问题可能是 MySQL 在前一个 ALTER TABLE 中已经崩溃并且留下了一个名为“A-xxx”或“B-xxx” 的老的数据库表。在这种情况下,到 MySQL 数据目录中并删除所有名字以 A-或 B-开始的文件。 (你可以把他们移到别的地方而不是删除他们)。 ALTER TABLE 工作方式是: 以要求的改变创建一个名为“A-xxx”的新表。 从老表把所有行拷贝到“A-xxx”。 老表被改名为“B-xxx”。 “A-xxx”被改名为你的老表的名字。 “B-xxx”被删除。 如果某些改名操作出错,MySQL 试图还原改变。如果出错严重(当然,这不应该发生。),MySQL 可能留下了老表为“B-xxx”但是一个简单改名就应该恢复你的数据。 18.20 怎样改变一张表中列的顺序 SQL 的要点是中抽象应用程序以避免数据存储格式。 你应该总是以你想要检索数据的意愿指定顺 序。例如: SELECT col_name1, col_name2, col_name3 FROM tbl_name; 将以 col_name1、col_name2、col_name3 的顺序返回列,而: SELECT col_name1, col_name3, col_name2 FROM tbl_name; 将以 col_name1、col_name3、col_name2 的顺序返回列。 在一个应用程序中,你应该决不基于他们的位置使用 SELECT * 检索列,因为被返回的列的顺序 永远不能保证;对你的数据库的一个简单改变可能导致你的应用程序相当有戏剧性地失败。 不管怎样,如果你想要改变列的顺序,你可以这样做: 以正确的列顺序创建一张新表。 执行 INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table. 删除或改名 old_table。 ALTER TABLE new_table RENAME old_table。 mysql 常见错误提示及解决方法 130 :文件格式不正确。(还不是很清楚错误的状况) 145 :文件无法打开。 1005:创建表失败。 1006:创建数据库失败。 1007:数据库已存在,创建数据库失败。 1008:数据库不存在,删除数据库失败。 1009:不能删除数据库文件导致删除数据库失败。 1010:不能删除数据目录导致删除数据库失败。

1011:删除数据库文件失败。 1012:不能读取系统表中的记录。 1016:文件无法打开,使用后台修复或者使用 phpmyadmin 进行修复。 Quote: 开始=>所有程序=>附件=>命令提示符 输入 mysql 所在硬盘盘符 cd mysql 所在目录 cd bin 输入 myisamchk -f D:usr/local/mysql/data/bbs/PW_members.MYI ps : D:usr/local/mysql/data/bbs 是你论坛数据库的路径 -f 根据具体情况选择,一般也可以选择 -r 注意你的 系统 C 盘或放数据库的硬盘空间是否足够,一般小于 1G 很容易出现错误。 或用 mysqlcheck 命令进行修复。具体的方法:利用命令行进入 mysql/bin 目录,执行 mysqlcheck -o -r phpwind -uroot -p 其中 phpwind 是你数据库的名称,root 是你的数据库用户名,然后会提示你输入密码。然后就 会修复你的数据库。 1017:服务器非法关机,导致该文件损坏。 1020:记录已被其他用户修改。 1021:硬盘剩余空间不足,请加大硬盘可用空间。 1022:关键字重复,更改记录失败。 1023:关闭时发生错误。 1024:读文件错误。 1025:更改名字时发生错误。 1026:写文件错误。 1030:可能是服务器不稳定。(具体原因不是很清楚) 1032:记录不存在。 1036:数据表是只读的,不能对它进行修改。 1037:系统内存不足,请重启数据库或重启服务器。 1038:用于排序的内存不足,请增大排序缓冲区。 1040:已到达数据库的最大连接数,请加大数据库可用连接数。

Quote: 在 my.ini 修改 max_connections=100 为 max_connections=1000 或更大,重启 mysql 1041:系统内存不足。 1042:无效的主机名。 1043:无效连接。 1044:数据库用户权限不足,请联系空间商解决。 1045:数据库服务器/数据库用户名/数据库名/数据库密码错误,请联系空间商检查帐户。 Quote: 方法:确保论坛 data 目录下的 sql_config.php 用户名与密码都正确.如果用户忘记了数据库的密 码,可以按如下方式进行密码的修改: 如果 MySQL 正在运行,首先停止。 启动 MySQL :bin/safe_mysqld –skip-grant-tables & 就可以不需要密码就进入 MySQL 了。 然后就是 >use mysql >update user set passWord=password(“new_pass”) where user=”root”; >flush privileges; 1046:没有选择数据库。 1048:字段不能为空。 1049:数据库不存在。 1050:数据表已存在。 1051:数据表不存在。 1054:字段不存在,自行建立字段。 1060:字段重复,导致无法插入这个字段。 1062:字段值重复,入库失败 1064:MySQL 不支持错误提示中的编码。 1065:无效的 SQL 语句,SQL 语句为空。 1067:MySQL 版本为 5,不支持空的默认值。 1081:不能建立 Socket 连接。 1114:数据表已满,不能容纳任何记录。

1115:设置的字符集在 MySQL 并没有支持。 1116:打开的数据表太多。 1129:数据库出现异常,请重启数据库。 1130:连接数据库失败,没有连接数据库的权限。 1133:数据库用户不存在。 1135:可能是内存不足够,请联系空间商解决。 1141:当前用户无权访问数据库。 1142:当前用户无权访问数据表。 1143:当前用户无权访问数据表中的字段。 1146:数据表缺失,请恢复备份数据 1147:未定义用户对数据表的访问权限。 1149:SQL 语句语法错误。 1158:网络错误,出现读错误,请检查网络连接状况。 1159:网络错误,读超时,请检查网络连接状况。 1160:网络错误,出现写错误,请检查网络连接状况。 1161:网络错误,写超时,请检查网络连接状况。 1169:字段值重复,更新记录失败。 1177:打开数据表失败。 1180:提交事务失败。 1181:回滚事务失败。 1193:不支持字符集限定(SET NAMES)。 1203: 当前用户和数据库建立的连接已到达数据库的最大连接数, 请增大可用的数据库连接数或 重启数据库。 1205:加锁超时。 1211:当前用户没有创建用户的权限。 1216:外键约束检查失败,更新子表记录失败。

1217:外键约束检查失败,删除或修改主表记录失败。 1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器。 1227:权限不足,您无权进行此操作。 1235:MySQL 版本过低,不具有本功能。 1250:客户端不支持服务器要求的认证协议,请考虑升级客户端。 1251:Client 不能支持 authentication protocol 的要求 Client does not support authentication protocol requested by server; consider upgrading MySQL client Quote: 方法 1:mysql> SET PASSWORD FOR -> ‘ some_user ‘@’ some_host ‘ = OLD_PASSWORD(‘ newpwd ‘); 结合我们的实际情况,在 MySQL Command Line Client 下运行: set password for root@localhost = old_password(’123456′); 方法 2: mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘newpwd’) -> WHERE Host = ‘some_host’ AND User = ‘some_user’; mysql> FLUSH PRIVILEGES; 上面红色的部分请按自己实际情况修改。 1267:不合法的混合字符集。 2002:服务器端口不对,请咨询空间商正确的端口。 2003:MySQL 服务没有启动,请启动该服务。 2008:MySQL client ran out of memory 错误指向了 MySQL 客户 mysql。这个错误的原因很简单,客户没有足够的内存存储全部结果。 2013:远程连接数据库是有时会有这个问题,MySQL 服务器在执行一条 SQL 语句的时候失去了 连接造成的。 10048: Quote: 建议在 my.ini 文件中修改最大连接数, 把 mysql_connect() 方法都改成了 mysql_pconnect() 方法.

要修改 mysql_pconnect(),可以在论坛的 data 目录的 sql_config.php 中 $pconnect = 0; //是否持久连接 修改成$pconnect = 1; 开启防刷新,严禁刷新太快. 10055:没有缓存空间可利用 Quote: 查看下你的 C 盘空间是否已经满,清除一些没有用的文件. 可以在后台的”论坛核心设置”,”核心功能设置”里”进程优化”开启,”GZIP 压缩输出”关 闭. 查找了一下 10055(没有缓存空间可利用)出错的原因,分析了 my.ini 的配制文件,在 my.ini 中如下: default-storage-engine=INNODB innodb_additional_mem_pool_size=2M innodb_flush_log_at_trx_commit=1 innodb_log_buffer_size=1M innodb_buffer_pool_size=10M innodb_log_file_size=10M innodb_thread_concurrency=8 觉得可以把 innodb_buffer_pool_size=10M 以上是对 mysql5 的 如果是 mysql4 可以在 my.ini 中增加如下: #innodb_data_file_path = ibdata1:2000M;ibdata2:2000M #innodb_data_home_dir = c:ibdata #innodb_log_group_home_dir = c:iblogs #innodb_log_arch_dir = c:iblogs #set-variable = innodb_mirrored_log_groups=1 #set-variable = innodb_log_files_in_group=3 #set-variable = innodb_log_file_size=5M #set-variable = innodb_log_buffer_size=8M #innodb_flush_log_at_trx_commit=1 #innodb_log_archive=0 #set-variable = innodb_buffer_pool_size=16M #set-variable = innodb_additional_mem_pool_size=2M #set-variable = innodb_file_io_threads=4 #set-variable = innodb_lock_wait_timeout=50 把前面的#去了 10061: Quote: 启动这台机器上的 MySQL 服务 如服务启动失败 加大如 100M 或是 1000M

一定是你的 my.ini 文件出了差错, MySQL 服务不能正常启动 你删除了它后,MySQL 就会按其默认配置运行, 那就没有问题了


相关文章:
MySQL数据库常见错误提示的对照表.doc
MySQL数据库常见错误提示的对照表_计算机软件及应用_IT/计算机_专业资料。MySQL数据库常见错误提示的对照表 145 :文件无法打开,使用 repair.php 修复 1005:创建表...
MYSQL常见出错代码解析大全.doc
MYSQL 常见出错代码解析大全(不断更新中。。。) 130 :文件格式不正确。(还不...1005:MYSQL 创建表失败 1006:MYSQL 创建数据库失败 1007:MYSQL 数据库已存在,...
MY SQL出错代码及出错信息对照.doc
MY SQL 出错代码及出错信息对照 mysql 的出错代码表,根据 mysql 的头文件 mysql/include/mysqld_error.h 整理而成。 1005:创建表失败 1006:创建数据库失败 1007...
常见的数据库错误的解决方法!.txt
常见的数据库错误的解决方法! - 这里所说的是MySQL Query Error提示错误的解决方法,部分是完全可以自己动手解决的,没有多大必要一遍遍问。除非是常规方法不能解决的~
MySQL数据库常见的出错代码及出错信息.doc
MySQL 数据库常见的出错代码及出错信息 本文介绍的 MySQL 数据库的出错代码表,依据 MySQL 数据库头文件 mysql/include/mysqld_error.h 整理而成。详细内容请大家...
MYSQL常见出错代码解析.doc
MYSQL常见出错代码解析_计算机软件及应用_IT/计算机_专业资料。MYSQL常见出错代码解析,本人亲测。1005:MYSQL 创建表失败 1006:MYSQL 创建数据库失败 1007:MYSQL 数据...
MYSQL常见错误列表和解决.doc
详细的MYSQL常见错误列表和解决方法 MYSQL 出错代码列表在用 mysql 创建表时,有...如果用户忘记了数据 库的密码,可以按如下方式进行密码的修改: 如果 MySQL 正在...
mysql_jdbc连接数据库-错误提示.doc
mysql_jdbc连接数据库-错误提示 - 常见的情况,一般有四种原因: 一:
MySQL常见错误提示及解决方法.txt
MySQL常见错误提示及解决方法 - 130 :文件格式不正确。(还不是很清楚错误的状况) 145 :文件无法打开。 1005:创建表失败。 1006:创建数据库失败。 1007:数据库....
MYSQL数据库错误及解决全攻略.pdf
MYSQL数据库错误及解决全攻略 - mysql 数据库错误及解决全攻略 说明:如果遇到数据库出错的问题修改相应的代码后一般要重启 mysql。如果遇 到 mysql 的问题可以先...
mysql数据库错误及解决全攻略.doc
mysql数据库错误及解决全攻略 - mysql 数据库错误及解决全攻略 说明:如果遇到数据库出错的问题修改相应的代码后一般要重启 mysql。如果遇 到 mysql 的问题可以先...
mysql常见问题解决方法.pdf
mysql常见问题解决方法_计算机软件及应用_IT/计算机_...没有数据库被选择上 分析:产生的原因有两种 config...出现了指定表中没有的字段名称,就会出现这 个错误...
mysql中错误代码.txt
mysql常见错误代码汇总日期:2009-09-21 来自:互联网 浏览:879 mysql中常见...常见的错误代码,方便查阅: 1005:创建表失败 1006:创建数据库失败 1007:数据库...
mysql数据库实时同步配置与常见问题解决方法.doc
mysql数据库实时同步配置与常见问题解决方法_计算机...这样不能在 mysql 的授权表中使用主机名了,只能...就会出现无法连接数据库的错误,因此我们需要把它适当...
mysql错误代码大全.txt
mysql错误代码大全 - 130 :文件格式不正确。(还不是很清楚错误的状况) 145 :文件无法打开。 1005:创建表失败。 1006:创建数据库失败。 1007:数据库已存在,创....
MySql常见错误.txt
mysql常见错误代码汇总: 我们操作mysql的时候经常会遇到一些错误并给出错误的...删除数据库文件失败 1012:不能读取系统表中的记录 1016:文件无法打开,使用后台...
mysql数据库连接1130问题解决.doc
2、 连接远程数据库失败 1130 Mysql 远程连接 Mysql 服务器的数据库,错误代码是 1130,ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this...
MySQL数据库中出现的问题及解决方法.doc
MySQL数据库出现的问题及解决方法_计算机软件及应用_IT/计算机_专业资料。MySQL 数据库 问题: 创建数据库不成功,报错: Access denied for user 原因:未设置密码...
MYSQL常见出错代码.txt
MYSQL常见出错代码 - MYSQL常见出错代码! 常见错误! 1016错误:文件无法打开,使用后台修复或者使用phpmyadmin进行修复。 1044错误:数据库用户权限不足,请联系空间商...
Mysql数据库的使用总结之ERROR 1146.doc
在使用 mysql 数据库过程中,遇到了错误 ERROR 1146 (42S02):Table doesn’t exist,经过了两天,终于解决了这个问题。引起该错误的原因不同,对应的解决方法也不 ...
更多相关标签: