楼主: oraclelang

MySQL中文參考手冊

[复制链接]
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
161#
 楼主| 发表于 2006-4-29 10:29 | 只看该作者
4.15.3 自動啟動和停止MySQL
mysql.server腳本可以被用來啟動或停止服務器,通過用start或stop參數調用它:

shell> mysql.server start
shell> mysql.server stop

mysql.server可在MySQL安裝目錄下的“share/mysql”目錄里找到,或在MySQL源代碼樹的“support-files”目錄下找到。

在mysql.server啟動服務器之前,它把目錄改變到MySQL安裝目錄,然後調用safe_mysqld。如果你有在一個非標准的地點安裝的二進制分發,你可能需要編輯mysql.server。修改它,咝衧afe_mysqld前,cd到正確的目錄。如果你想要作為一些特定的用戶咝蟹?掌鳎?憧梢愿淖僲ysql_daemon_user=root行使用其他用戶,你也能修改mysql.server把其他選項傳給safe_mysqld。

mysql.server stop通過向服務器發出一個信號停止它。你可手工執行mysqladmin shutdown關閉服務器。

當你開始使用MySQL作為生產應用時,你可能想要增加這些啟動並且停止命令到在你的“/etc/rc * 文件中適當的地方。注意如果你修改mysql.server,那麼如果某個時候你升級MySQL時,你的修改版本將被覆蓋,因此你應該做一個你可重新安裝的編輯過的版本的拷貝。

如果你的系統使用“/etc/rc.local”啟動外部腳本,你應該添加下列到其中:

/bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld &'
你也可以在一個全局“/etc/my.cnf”文件中增加mysql.server的選項。一個典型的“/etc/my.cnf”文件可能看起來像這樣:

mysqld]
datadir=/usr/local/mysql/var
socket=/tmp/mysqld.sock
port=3306

[mysql.server]
user=mysql
basedir=/usr/local/mysql

mysql.server腳本使用下列變量:user、datadir、basedir、bindir和pid-file。
見4.15.4 選項文件。

4.15.4 選項文件
MySQL3.22 可以從選項文件中為服務器和客戶讀取缺省啟動選項。

在Unix上,MySQL從下列文件讀取缺省選擇:


文件名  用途  
/etc/my.cnf  全局選項
DATADIR/my.cnf  服務器特定的選項目
~/.my.cnf  用戶特定的選項

DATADIR是MySQL的數據目錄(典型地對二進制安裝是“/usr/local/mysql/data”或對源代碼安裝是“/usr/local/var”)。注意:這是在配置時間指定的目錄,不是mysqld啟動時用--datadir指定的目錄!(--datadir在服務器尋找選項文件的地方無效,因為它以前尋找他們,它處理任何命令行參數。)

MySQL在Win32上從下列文件讀取缺省選項:

文件名  用途
windows-system-directory\my.ini  
C:\my.cnf  全局選項
C:\mysql\data\my.cnf  服務器特定的選項

注意,在Win32上你應該用/而不是\指定所有的路徑,如果你使用\,你需要指定兩個,因為在MySQL里面\是轉義字符。

MySQL試圖以上述所列的順序讀取選項文件。如果存在多個選項文件,在一個後面文件讀取的選項優先于在先前讀取的一個文件中指定的同一個選項,在命令行上指定的選項優先于在任何選項文件指定了的選項。有些選擇能使用環境變量指定,在命令行或在選項文件指定的選項優先于環境變量。

下列程序支持選項文件:mysql、mysqladmin、mysqld、mysqldump、mysqlimport、mysql.server、myisamchk和myisampack。

你能使用選項文件指定一個程序支持的任意長的選項!用--help選項咝谐绦蚩傻玫降目捎眠x項的表。

一個選項文件可以包含下列形式的行:

#comment
注釋行以“#”或“;”開始,空行被忽略。
[group]
group是你想為其設置選項的程序或組的名字。在一個組行後,任何option或set-variable行應用于命名的組,直到選擇文件結束或其他組的給出。
option
這等價于在命令行上的--option。
option=value
這等價于在命令行上的--option=value。
set-variable = variable=value
這等價于在命令行上的--set-variable variable=value。該語法必須被用來設置一個mysqld變量。
client組允許你指定適用于所有MySQL客戶的選項(不是mysqld)。這是理想的組來指定你用來與服務器連接的口令。(但是保証只是選項文件本身是可讀的和可寫的。)

注意,對域選項和值,所有頭部和尾部空白自動被刪除。你可以在的值串中使用轉義順序“\b”、“\t”、“\n”、“\r”、“\\”和“\s”(“\s”==空白)。

這是一個典型的全局選項文件:

[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
set-variable = key_buffer=16M
set-variable = max_allowed_packet=1M

[mysqldump]
quick

這是典型的用戶選項文件:

[client]
# The following password will be sent to all standard MySQL clients
password=my_password

[mysql]
no-auto-rehash

如果你有一個源代碼分發,你將在“support-files”目錄下找到一個名為“my-example.cnf”樣品配置文件。如果你有二進制分發,在“DIR/share/mysql”目錄下查找,在此DIR是MySQL安裝目錄的路徑(一般是“/usr/local/mysql”)。你可以拷貝“my-example.cnf”到你的主目錄(重新命名拷貝為“.my.cnf”)來試驗。

為了告訴一個MySQL程序不讀任何選項文件,在命令行上指定--no-defaults作為第一個選項。這必須是第一個選項,否則它將無效!如果你想檢查使用哪個選項,你可以給出--print-defaults選項作為第一個選項。

如果你想要強制使用一個特定配置文件,你可以使用選項--defaults-file=full-path-to-default-file。如果你這樣做,只有指定的文件將被讀取。

開發者注意:選項文件的處理簡單地通過處理所有在任何命令行前參數的匹配選項來實現(即,在適當的組里的選項),這對使用多次指定的一個選項的最後實例的程序工作的很好。如果你有這樣一個處理多重指定選項但不讀選項文件的舊程序, 你只需要增加2行給與它那種能力。檢查任何標准的MySQL客戶的源代碼看怎樣做。

4.16 升級/降級MySQL時有什麼特別的事情要做?
只要你有MySQL同一個的基礎版本,你總可以在同樣的體系結構上的不同版本之間的移動MySQL表格(form)和數據文件。當前的基礎版本是3。如果你通過重新編譯MySQL改變字符集(也可以改變排序順序),你必須在所有的表上咝衜yisamchk -r -q,否則你的索引不能正確被排序。

如果你偏執于或擔心新版本,你總能重新命名的舊mysqld為類似于mysqld-'old-version-number'。那麼如果你的新mysqld做一些意外的事情,你可以簡單地關掉它並重啟你的舊mysqld!

當你做一個升級時,當然你也應該備份你的舊數據庫。有時有點偏執狂是好的!

在升級後,如果你重新編譯客戶程遇到問題,像Commands out of sync或意外的核心傾倒,在編譯你的程序時,你可能使用了一個舊的頭文件或庫文件。在這種情況下,你應該檢查你的“mysql.h”文件和“libmysqlclient.a”庫文件的日期以証實他們來自新的MySQL發行。如果不是,請重新編譯你的程序!

如果你有些問題,新的mysqld服務器不想啟動或你不能沒有口令連接,檢查你確實沒有來自你的舊安裝的一些舊的“my.cnf”文件!你可以用program-name --print-defaults檢查。如果這輸出任何非程序名字的任何東西,你有一個活躍my.cnf文件將可以影響一些事情!

無論何時你安裝一個新版本的MySQL,重新構造並重新安裝Msql-Mysql-modules分發是一個好主意,特別是在升級MySQL後,如果你注意到諸如你的所有DBI腳本傾倒核心症狀。


4.16.1 從一個3.22版本升級到3.23
MySQL 3.23支持新MyISAM類型和舊ISAM類型的表。你不必須變換你的舊式表給3.23使用。缺省地,所有的新表將用類型MyISAM創建(除非你使用--default-table-type=isam選項啟動mysqld)。你可以用ALTER TABLE或Perl腳本mysql_convert_table_format將一個ISAM表轉換成一個MyISA表。

3.22和3.21客戶將毫無問題地與一個3.23服務器一起工作。

當升級到3.23時,下面列出你必須注意的事情:

INNER和DELAYED現在是保留字。
FLOAT(X)現在是一個真正的浮點類型。
當聲明DECIMAL(length,dec)時,長度參數不再包括一個符號或小數點位置。
一個TIME字符串必須是下列現有格式之一:[[[DAYS] [H]H:]MM:]SS[.fraction]或[[[[[H]H]H]H]MM]SS[.fraction]。
現在,LIKE使用'='同樣的字符比較規則比較字符串。如果你要求舊的行為,你可以用CXXFLAGS=-DLIKE_CMP_TOUPPER標志編以MySQL。
REGEXP現在對正常(不是二進制的)字符串是忽略大小寫的。
在你檢查/修複表時,對MyISAM表(.MYI),你應該使用myisamchk,而對ISAM(.ISM)表使用isamchk。
如果你想要你的mysqldumps在MySQL3.22和3.23之間兼容,你應該不使用mysqldump的--opt或--full選項。
檢查所有對DATE_FORMAT()的調用,保証在在每個格式字符前有一個“%”。
mysql_fetch_fields_direct現在是函數(它以前是一個宏)並且它返回一個指向MYSQL_FIELD的指針而不是一個MYSQL_FIELD。
mysql_num_fields()可以不再被用在一個MYSQL*對象上(它現在是一個函數,拿MYSQL_RES*作為一個參數)。相反你現在應該使用mysql_field_count()。
在MySQL3.22,SELECT DISTINCT ...的輸出幾乎總是被排序的。在3.23上,你必須使用GROUP BY或ORDER BY獲得排序的輸出。
如果沒有匹配的行,SUM()現在返回NULL,而不是 0。這是遵照ANSI SQL。
新的限制詞:CASE、THEN、WHEN、ELSE和END。

4.16.2 從一個3.21版本升級到3.22
沒有影響相容性的東西在3.21和3.22之間已改變。唯一的缺陷是用DATE類類型創建的新表將使用新方法存儲日期。你不能從一個mysqld舊版本存取這些新字段。

在安裝MySQL3.22 以後,你應該啟動新的服務器並且然後咝衜ysql_fix_privilege_tables腳本。這將增加你使用GRANT命令所需的新權限。如果你忘記了這個,當你試著使用ALTER TABLE, CREATE INDEX或DROP INDEX時,你將得到Access denied。如果你的MySQL根用戶要求一個口令,你應該把它作為一個參數給mysql_fix_privilege_tables。

mysql_real_connect()的C API接口改變了。如果你有一個舊的客戶程序調用該函數,你必須放一個0作為新db參數(或為了快速連接重新編碼發送的db單元的客戶)。你在mysql_real_connect()前也必須調用mysql_init()!做這個改變允許新的mysql_options()函數在MYSQL處理程序結構中保存選項。

4.16.3 從一個3.20版本升級到3.21
如果你正在咝幸粋

使用道具 举报

回复
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
162#
 楼主| 发表于 2006-4-29 10:30 | 只看该作者
現在HAVING必須在任何ORDER BY子句前被指定。
LOCATE()參數被交換了。
有一些新的保留字。最著名是DATE、TIME和TIMESTAMP。
4.16.4 升級到其他體系結構
如果你正在使用MySQL3.23,你能在不同的支持同樣浮點格式的體系結構之間拷貝.frm、.MYI和.MYD。(MySQL考慮了任何字節交換的問題)。

MySQL ISAM數據“ *.ISD”和索引文件“ *.ISM”文件是依賴于系統結構並在某些情況下依賴于OS。如果你想要移動你的應用程序到有與你當前系統不同的體系結構或OS的其他機器上,你不應該試圖通過簡單地拷貝文件到另外的機器上來移動一個數據庫,相反使用mysqldump。

缺省地,mysqldump將創建一個滿是SQL語句的文件,然後你可以把文件轉移到其他機器上並且把它作為mysql客戶的輸入。

試一試mysqldump --help看可得到什麼選項。如果你正在移動數據到一個更新的MySQL版本,你應該用得到的更新的版本使用mysqldump --opt得到一個快速、緊湊的倒出(dump)。

最容易(盡管不是最快)的在2台機器之間移動一個數據庫的方法是在數據庫所在的機器上咝邢铝忻?睿

使用道具 举报

回复
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
163#
 楼主| 发表于 2006-4-29 13:05 | 只看该作者
UP

使用道具 举报

回复
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
164#
 楼主| 发表于 2006-4-29 13:07 | 只看该作者
5 MySQL與標准的兼容性?
5.1   MySQL對ANSI SQL92擴充
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關鍵詞。

使用道具 举报

回复
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
165#
 楼主| 发表于 2006-4-29 13:08 | 只看该作者
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”文件為相應的表。

使用道具 举报

回复
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
166#
 楼主| 发表于 2006-4-29 13:08 | 只看该作者
在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子句。

使用道具 举报

回复
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
167#
 楼主| 发表于 2006-4-29 13:08 | 只看该作者
使用帶關鍵詞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語句。見7.9 OPTIMIZE TABLE句法。
SHOW語句。見7.21 SHOW句法(得到表、列等的信息)。
字符串可以被“"”或“'”包圍,而不只是“'”。
使用“\”轉義字符。
SET OPTION語句。見7.25 SET OPTION句法。
你不需要命名所有在GROUP BY部分的被選擇的列。這為一些很特定的情況給出更好的性能,而不是一般的查詢。見7.4.13 用于GROUP BY子句的函數。

使用道具 举报

回复
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
168#
 楼主| 发表于 2006-4-29 13:09 | 只看该作者
為了方便來自于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()。

使用道具 举报

回复
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
169#
 楼主| 发表于 2006-4-29 13:09 | 只看该作者
擴展的正則表達式操作符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;

5.2 以ANSI模式咝蠱ySQL

使用道具 举报

回复
论坛徽章:
4
每日论坛发贴之星
日期:2005-04-26 01:01:12会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2008-01-09 22:26:12
170#
 楼主| 发表于 2006-4-29 13:09 | 只看该作者
如果你用--ansi選項啟動mysqld,MySQL的下列行為改變。

||是字符串並置而不是OR。
可在一個函數名字之間與“(”有任何數量的空格。這也使所有的功能名字成為保留詞。
"將是一個標識符引號字符(象MySQL `引號字符一樣)而不是一個字符串引號字符。
REAL將是FLOAT一個同義詞,不是DOUBLE一個同義詞。
5.3 MySQL相比ANSI SQL92的差別
我們嘗試使得MySQL遵照ANSI SQL標准和ODBC SQL標准,但是在一些情況下,MySQL做一些不同的事情:

--只是一個注釋,如果後面跟一個白空字符。見5.4.7 `--'作為一個注釋的開始。
對于VARCHAR列,當值被存儲時,拖後的空格被刪除。見E MySQL已知的錯誤和設計缺限。
在一些情況下,CHAR列偷偷地被改變為VARCHAR列。見7.7.1 平靜的列指定變化。
當你刪除一個表時,對表的權限不自動地廢除。你必須明確地發出一個REVOKE來廢除對一個表的權限。見7.26 GRANT和REVOKE句法。
5.4 MySQL缺乏的功能

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表