顯示具有 MySQL-教學 標籤的文章。 顯示所有文章
顯示具有 MySQL-教學 標籤的文章。 顯示所有文章

2013年8月10日 星期六

Install MySQL Using MacPorts for MacOS X

Install MySQL Using MacPorts

1- Install MacPorts
http://www.macports.org/install.php

2- Update MacPorts:
sudo port selfupdate

3- Install MySQL server and client binaries:
sudo port install mysql55

4- Install MySQL server startup scripts:
sudo port install mysql55-server

5- Initialize the Database:
sudo /opt/local/lib/mysql55/bin/mysql_install_db --user=mysql

6- Start MySQL:
sudo /opt/local/share/mysql55/support-files/mysql.server start

7- Set root password:
/opt/local/lib/mysql55/bin/mysqladmin -u root password 'changepasswordhere'

8- Enable the startup script so mysql starts on boot
sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql55-server.plist
– or --
sudo port load mysql55-server

9- If you need to uninstall/reinstall for whatever reason, remove the database directory when you do the uninstall
sudo port uninstall mysql55-server
cd /opt/local/var/db/
sudo rm -rf mysql55/

10- To check the contents of any package:
sudo port contents 

reference : http://jackal.livejournal.com/2160464.html

2011年11月17日 星期四

Mysql忘記root密碼

1.先停掉mysql

# /etc/init.d/mysql stop

2.以–skip-grant-table& 的參數啟動mysql
/usr/bin/mysqld_safe --skip-grant-table&

3. 更改root 密碼

# mysql mysql
mysql> UPDATE user SET password=password('123456') WHERE user='root';
mysql> exit

4.停掉mysql再重跑

# /etc/init.d/mysql stop
# mysql -u root -p

reference : http://tw.myblog.yahoo.com/cherry-liang/article?mid=579&prev=633&next=-2&page=1&sc=1

2010年7月22日 星期四

刪除mysql二進制記錄


$date=date('Y-m-d H:i:s',mktime(23,59,59,date('m'),date('d')-4,date('Y')));
$sql="PURGE MASTER LOGS BEFORE '".$date."'";
my_query($sql);

2010年3月4日 星期四

Howto: Use mysql or run mysql queries from shell script

Q. I have job (executed from shell script) where I need to run mysql query from a shell script. I want to run mysql from within a shell script rather than use it interactively by typing mysql -u user -p dbnane command.

How do I use mysql in Shell Scripts?

A. I recommend using Perl or php as it is easier to get data from mysql. You can easily use APIs. BASH/KSH Shell does not provide access to mysql directly.

However you can pass sql command using mysql -e swich. Following query connect as root and print mysql server uptime:
$ mysql -u root -p -e "STATUS" | grep -i uptime

Output:

Uptime: 4 hours 59 min 56 sec
You can add code as follows from shell script:

#!/bin/bash
mysql dbnane<SELECT * from table;
EOFMYSQL
Save and execute script as follows:
$ chmod +x script.sh
$ ./script.sh

I strongly recommend using perl or php as shell provides limited access.

2010年1月19日 星期二

[MySQL]今天在Labs中架設另外一台一模一樣的MySQL環境

因為舊的MySQL環境的空間不足
今天在Labs中架設另外一台一模一樣的MySQL環境
所以直接用scp將/usr/local/mysql/var中的所以資料庫搬移過去
shell > scp -r -p database1 database2 ... labs_user@labs_ip:/usr/local/mysql/var

移完後再把所有chown & chmod設成跟舊的MySQL一樣即可正常work
shell > chwon -R mysql:mysql database1 database2 ...
shell > chmod -R 660 database1/* database2/* ...

2009年12月18日 星期五

MySQL big5轉utf8編碼

mysqldump -uroot -p --default-character-set=latin1 nfspc >nfspc.sql
mysqldump -uroot -p --default-character-set=latin1 pigfather >pigfather.sql

piconv -f big5 -t utf8 nfspc.sql >nfspc_utf8.sql
piconv -f big5 -t utf8 pigfather.sql >pigfather_utf8.sql

vi nfspc_utf8.sql

SET NAMES utf8;
SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_RESULTS=utf8;

:1,$s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/g
:1,$s/latin1/utf8/gc
:1,$s/許\\/許/g
:1,$s/功\\/功/g
:1,$s/蓋\\/蓋/g
:1,$s/餐\\/餐/g
:1,$s/愧\\/愧/g
:1,$s/擺\\/擺/g
:1,$s/穀\\/穀/g
:1,$s/淚\\/淚/g
:1,$s/豹\\/豹/g
:1,$s/珮\\/珮/g


mysql -uroot -p nfspc < nfspc_utf8.sql
mysql -uroot -p pigfather < pigfather_utf8.sql

摘自:http://tw.myblog.yahoo.com/d89413125/article?mid=70&prev=74&next=62

SQL Join語法

SQL Join語法

Join有兩種屬性:
INNER
OUTER

1.INNER
只顯示匹配的行.

2.OUTER
不論是否匹配,都顯示行.
LEFT, RIGHT, FULL 都帶有OUTER屬性

Join共有六種:
Inner Join
Natural Join
Left Outer Join
Right Outer Join
Full Outer Join
Cross Join

1.Inner Join
Inner Join其實等同於多個Where條件式的連結,

FROM a, b WHERE a.id = b.id AND b.val > 5
FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5
是一樣的

2.Natural Join
Natural Join只是自動的匹配兩個表之間相同的欄位,

FROM a, b WHERE a.id = b.id AND b.val > 5
FROM a NATURAL JOIN b WHERE b.val > 5
是一樣的.
可用在任何一種Inner 或 Outer Join.
Natural 與 USING 也是很相像的,只是Natural
只會讓兩個表的相同欄位出現一次.

3.Left Outer Join
4.Right Outer Join
其實這兩個幾乎是一樣的,只是方向性的不同.
以Left Outer Join來說,左邊顯示所有左表的值,而右邊顯示右表匹配的值.
如果沒有匹配的右表表,則放空值.
Right Outer Join則左右方向相反.

5.Full Outer Join
左右表都顯示,匹配的則顯示,沒有匹配的放空值.
好比把 Left Outer Join 和 Right Outer Join作聯集.

6.Cross Join
交叉連結,會得到兩個表的所有乘積組合.

資料來源:http://www.wretch.cc/blog/sky4s/2250385

MySQL Tarball Source 安裝備忘

下載 MySQL 4.1.x Source (Compressed GNU TAR archive)

建立 mysql 帳號 (刻意讓 uid / gid 同 FC3 RPM 安裝)

groupadd -g 27 mysql
useradd -u 27 -g mysql -d /var/lib/mysql mysql

安裝 MySQL

tar zxf mysql-4.1.22.tar.gz
cd mysql-4.1.22
./configure --prefix=/usr/local/mysql
make && make install

cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql-log-rotate /etc/logrotate.d/mysql
cp support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
chkconfig --add mysql

初始化資料庫與系統環境

export PATH=$PATH:/usr/local/mysql/bin
mysql_install_db --user=mysql
cd /usr/local/mysql
chown -R root .
chown -R mysql var
chgrp -R mysql .

設置管理員帳號密碼 (首次啟動 MySQL)

Script 方式

/etc/init.d/mysql start
mysqladmin -u root password 'your_password'

停止 MySQL: /etc/init.d/mysql stop

手動方式

mysqld_safe --user=mysql &
mysqladmin -u root password 'your_password'

停止 MySQL: mysqladmin -u root -p shutdown

設定系統環境

設定 Log File
vi /etc/my.cnf

[safe_mysqld]
err-log = /usr/local/mysql/var/mysqld.log

設定 mysqladmin 參數檔
vi /root/.my.cnf

[mysqladmin]
password=your_password
user=root

加入路徑 (PATH)
vi ~/.bash_profile

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
#source ~/.bash_profile

設定 shared library
vi /etc/ld.so.conf

/usr/local/mysql/lib/mysql

ldconfig

讓 Perl 支援 MySQL

cpan (或 perl -MCPAN -e shell)

install DBI::DBD

install DBD::mysql

若 DBD::mysql 安裝失敗

到 http://search.cpan.org 找 DBD::mysql, 下載 tarball source

perl Makefile.PL --mysql_config=/usr/local/mysql/bin/mysql_config

make && make install


附錄: 其他備忘

mirror tips
rsync -a --compress --progress --bwlimit=10 root@master.host:/remote/path /local/path
MySQL Replication
每 5 分鐘執行 rsync 同步 /blog
mysqldump
mysqldump -u root -p db_name > dump_file.sql
mysql -u root -p -A db_name < dump_file.sql

摘自:http://cha.homeip.net/blog/archives/2007/09/mysql_tarball_s.html

Linux RHEL MySQL 5.1.41安裝教學

到http://dev.mysql.com/downloads/mysql/5.1.html下載
Source downloads -- Compressed GNU TAR archive (tar.gz)

shell> yum -y install gcc-c++
shell> yum -y install ncurses-devel

shell> tar -zxvf mysql-5.1.41.tar.gz
shell> cd mysql-5.1.41
shell> CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors \
-fno-exceptions -fno-rtti" ./configure \
--prefix=/usr/local/mysql --enable-assembler \
--with-mysqld-ldflags=-all-static --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=all
shell> make
shell> make install

shell> groupadd mysql
shell> useradd -g mysql mysql
shell> gunzip < mysql-VERSION.tar.gz | tar -xvf -
shell> cd mysql-VERSION
shell> ./configure --prefix=/usr/local/mysql
shell> make
shell> make install
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> cd /usr/local/mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> bin/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql var
shell> bin/mysqld_safe --user=mysql &

shell> cp support-files/mysql.server /etc/init.d
shell> /etc/init.d
shell> chmod +x mysql.server
shell> /etc/init.d/mysql.server start|stop|restart

2009年11月25日 星期三

mysqldump教學

mysqldump ignore exclude table

mysqldump -u username -p database --ignore-table=database.table1 --ignore-
table=database.table2 > database.sql


mysqldump particular table

mysqldump -u username -p database table1 > table1.sql

2009年9月5日 星期六

Uninstall mysql on Red Hat Enterprise Linux

List currently installed packages..
#rpm -qa | grep -i '^mysql-'

Then remove one-by-one

rpm --nodeps -ev MySQL-first-package
rpm --nodeps -ev MySQL-second-package

rpm --nodeps -ev MySQL-last-package

Once you remove all packages you download all MySQL 5.4.* packages into a dir and run below command

rpm -ivh MySQL-*.rpm

2009年7月2日 星期四

ZRM for MySQL 即時備份的新選擇

備份機制對於 MySQL 來說是最弱的一環,當中最難處理的就是 InnoDB 備份,除了透過 mysqldump 這種原始的方式之外,還有 MySQL 官方提供的手動備份資檔案的方式。然而唯一可以即時備份 InnoDB 的軟體又只有 InnoDB Hot Backup 壟斷整個市場。(諷刺的是,現在已經是 Oracle 的公司了)


所以只要談到 InnoDB 的即時備份,也只能乖乖的每年繳保護費給 InnoDB Hot Backup 了。

然而,在 2007 年初 Zmanda 在 MySQL 發佈了MySQL Backup & Recovery for the Enterprise,也正式宣告這些令人困擾的備份方式將有所改變。

Zmanda Recovery Manager for MySQL (以下簡稱為 ZRM for MySQL) 不但有 InnoDB 的即時備份、定時自動備份功能,還有 Incremental backup 以及 Granular recovery、Selective recovery。


(ZRM for MySQL 與 MySQL 常見的備份方式比較)

ZRM for MySQL 不但功能強大,而且還是 OpenSource 的軟體,想要了解 ZRM for MySQL 其它強大的功能,可以從下列的網址下載簡報:
http://downloads.mysql.com/webinars/pdf/Zmanda_Jan_17.pdf

ZRM for MySQL –Downloads
http://www.zmanda.com/download-zrm.php

ZRM for MySQL –Wiki
http://mysqlbackup.zmanda.com/

ZRM for MySQL –Forums
http://forums.zmanda.com/

延伸閱讀:
MySQL AB: Backing Up and Recovering an InnoDB Database
Jeremy Zawodny: MySQL Backup & Recovery


摘自:http://www.neo.com.tw/archives/1093

2009年5月19日 星期二

MySQL安裝優化篇


#CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti -fomit-frame-pointer -ffixed-ebp"



#./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=all


#./configure --prefix=/opt/mysql --enable-assembler --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --with-unix-socket-path=/opt/mysql/tmp/mysql.sock --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=all



#make -j2;make install;

# adduser mysql


# ./usr/local/mysql/bin/mysql_install_db
Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system


# chmod 700 share/mysql/mysql.server
# adduser mysql
# mkdir /opt/script -p
#cd



/usr/local/mysql/bin/mysqladmin -u root password 'new-password'
/usr/local/mysql/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'

Alternatively you can run:
/usr/local/mysql/bin/mysql_secure_installation

You can start the MySQL daemon with:
cd /usr/local/mysql ; /usr/local/mysql/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /usr/local/mysql/mysql-test ; perl mysql-test-run.pl


#edit /root/.bashrc

vi /root/.bashrc
type those at the end

/usr/local/mysql/bin/mysql_secure_installation


### install google perftools
tar zxvf google-perftools-1.0
cd google-perftools-1.0


./configure --prefix=/opt/google-perftools && make -j2 && make install
echo /opt/google-perftools/lib >> /etc/ld.so.conf
ldconfig -v


vi mysql_config.sh

### config mysql


mysqld_bin_path='/usr/local/mysql/bin/mysqld_safe'
mysql_config_line=`cat -n $mysqld_bin_path | grep '# executing mysqld_safe' | awk '{ print $1}'`
sed -ie ''$mysql_config_line' a\
export LD_PRELOAD=/opt/google-perftools/lib/libtcmalloc.so' $mysqld_bin_path
/etc/init.d/mysql restart

### verify
/usr/sbin/lsof -n | grep tcmalloc
# *** message like below ***
# mysqld 13380 mysql mem REG 8,3 1663600 3860989 /opt/google-perftools/lib/libtcmalloc.so.0.0.0
#

2009年2月1日 星期日

[MySQL]檢查MySQL的連線數


netstat -an | grep "192.168.1.1.3306" | grep "ESTABLISHED" | wc -l

2008年8月7日 星期四

[MySQL]mysql --default-character-set=utf8資料匯入問題

[案例]
1.公司的MySQL DBServer編碼為[big5]
2.UrWawa的urwawacom_db.sql檔為[utf8]

[匯入方式]

mysql -u mysql_root --default-character-set=utf8 -p urwawacom_db < urwawacom_db.sql


即可

2008年5月30日 星期五

ADODB SET NAMES

$conn->Execute("SET NAMES 'big5'");
or
$conn->Execute("SET NAMES 'utf8'");

2008年3月15日 星期六

MySQL 設定 Replication (Master - Slave)

MySQL 設定寫入 Master 後, 自動 Replication 到 Slave 去, 運作基本原理是:



  1. INSERT/UPDATE/DELETE 語法, 自動寫入 Master 的 binlog file.

  2. 由 GRANT REPLICATION 授權的帳號, 自動將 SQL 語法 repl 到 Slave 的 DB 執行.

  3. 因而完成 Replication 的動作.


下述詳細可見: MySQL 5.0 Reference Manual :: 15 Replication


設定 Replication 的操作 (Master)



  1. $ sudo vim /etc/mysql/my.cnf # 下面是 Debian Linux 的設定, 找到下面的設定, 新增/修改 成下面這樣子.
    #bind-address           = 127.0.0.1

    server-id               = 1

    log_bin                 = /var/log/mysql/mysql-bin.log


  2. $ sudo /etc/init.d/mysql restart

  3. $ mysql -u root -p # 進入 mysql

  4. mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_pass'; # 先假設 帳號 repl, 密碼 repl_pass, 此步驟是 設定 repl 的帳號/密碼, 格式: GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%.mydomain.com' IDENTIFIED BY 'repl_password'; (Replace <some_password>with a real password!)

  5. mysql> FLUSH TABLES WITH READ LOCK; # 先讓 DB 不要再寫資料進去

  6. mysql> SHOW MASTER STATUS; # 這邊資料都要記好, 等一下設定 Slave 要用

    +----------------------+------------+------------------+----------------------+

    | File                     | Position   | Binlog_Do_DB | Binlog_Ignore_DB  |

    +----------------------+------------+------------------+----------------------+

    | mysql-bin.000014  |      232   |                      |                          |

    +----------------------+------------+------------------+----------------------+


  7. mysql> quit # 離開, 準備倒資料

  8. 倒資料, 可以由下述的方法倒, 此次採用步驟 1


    1. $ mysqldump -u root -p DB > dbdump.sql

    2. $ mysqldump --all-databases --lock-all-tables >dbdump.sql

    3. $ mysqldump --all-databases --master-data >dbdump.sql # --master-data: 會自動將CHANGE MASTER 的語法帶在裡面





  9. $ mysql -u root -p # 進入 mysql


  10. mysql> UNLOCK TABLES; # dump 完資料後, 進去 mysql 解除唯讀

  11. 再來就是將 dbdump.sql scp 到 Slave 去即可.


  12. Master 就到此為止.


設定 Replication 的操作 (Slave)



  1. $ sudo vim /etc/mysql/my.cnf
    server-id               = 2  # server-id 不能與其它機器相同

    log_bin                 = /var/log/mysql/mysql-bin.log


  2. $ mysql -u root -p # 進入 mysql

  3. mysql> create database DBNAME;

  4. mysql> use DBNAME; source dbdump.sql; 或 $ mysql -u root -p DBNAME < dbdump.sql

  5. mysql> CHANGE MASTER TO

        
    MASTER_HOST='MASTER_HOSTNAME',

        
    MASTER_USER='repl',

        
    MASTER_PASSWORD='repl_pass',

        
    MASTER_LOG_FILE='mysql-bin.000014',

        
    MASTER_LOG_POS=1319669; # 這邊就要用到之前 Master 抄下來的值.

  6. mysql> START SLAVE; # 這樣子就會開始 Replication 了, 會將 LOG_POS 之後新的資料開始 sync 回來.

  7. mysql> show master status; # 檢查一下設定

  8. mysql> show slave status; # 檢查一下設定, 看是不是有異常狀況.


測試



  1. 在 master: mysql> create database test2;

  2. 在 slave: mysql> show database; # 應該會看到 test2

  3. 在 master 上的任何操作應該都會馬上 replication 到 slave 去.


其它相關網頁




摘自:http://plog.longwin.com.tw/my_note-app-setting/2008/03/11/mysql_replication_master_slave_set_2008

2008年1月23日 星期三

MySQL欄位型態


建立資料表時,我們必須定義每個欄位所採用的資料型態,以下將介紹 MySQL 所支援的各種欄位型態。
 
數字型態
型態空間
需求
範圍
TINYINT[(M)]1 byteSigned: -128 to 127 (-27 to 27-1)
Unsigned: 0 to 255 (0 to 28-1)
SMALLINT[(M)]2 bytesSigned: -32768 to 32767 (-215 to 215-1)
Unsigned: 0 to 65535 (0 to 216-1)
MEDIUNINT[(M)]3 bytesSigned: -8388608 to 8388607 (-223 to 223-1)
Unsigned: 0 to 16777215 (0 to 224-1)
INT[(M)]
INTEGER[(M)]
4 bytesSigned: -2147483648 to 2147483647 (-231 to 231-1)
Unsigned: 0 to 4294967295 (0 to 232-1)
BIGINT[(M)]8 bytesSigned: -9223372036854775808 to 9223372036854775807 (-263 to 263-1)
Unsigned: 0 to 18446744073709551615 (0 to 264-1)
FLOAT(precision)4 or 8若 precision <= 24 的話,視為 FLOAT(單精數)
若 25 <= precision <= 53 的話,則視為 DOUBLE(倍精數)
FLOAT[(M,D)]4 bytes±1.175494351E-38 ±3.402823466E+38
DOUBLE[(M,D)]
REAL[(M,D)]
8 bytes±1.7976931348623157E+308 ±-2.2250738585072014E-308
DECIMAL[(M[,D])]
DEC[(M[,D])]
NUMERIC[(M[,D])]
M+2依 M 與 D 值而定
 上表中的 M 代表「最大顯示寬度」,其值不得大於 255。無論您將欄位的型態設定為「INT(4)」或「INT(5)」,都不影響它儲存數值的能力;但在顯示時,就可以發現其差異了。我們將兩個欄位分別設為「INT(4)」與「INT(5) ZEROFILL」(ZEROFILL 會在前頭的空位補 0),然後兩者均存入數字 4,在顯示其資料時,前者是「4」,後者則是「00004」。
 上表中的 D 代表「小數位數」,其值不得大於 30,也不能大於 M-2。
 如果您將上述欄位型態設定為 UNSIGNED 的話,對整數型態(TINYINT, SMALLINT, MEDIUNINT, INT, and BIGINT)而言,可以儲存較大的正整數;對其餘的浮點數型態而言,則可以避免被存入負的數值。
 若您存入的數值超過該欄位的範圍時,MySQL 只會取其所能處理的最大值。例如,您在 TINYINT 型態的欄位中存入「300」這個值,結果將只剩下「127」。

日期與時間型態
型態空間需求範圍
DATE3 bytes'1000-01-01' to '9999-12-31'
TIME3 bytes'-838:59:59' to '838:59:59'
DATETIME8 bytes'1000-01-01 00:00:00' to '9999-12-31 23:59:59'
TIMESTAMP[(M)]4 bytes自 1970 年起,至 2037 年的某時
YEAR[(2 | 4)]1 bytes4-digit format: 1901 to 2155
2-digit format: 1970 to 2069
 在使用 TIMESTAMP 型態時,您可以指定「最大顯示寬度」,就是 M。不同的 M 值與儲存所需空間無關,而是與顯示的格式有關。請見下表:
型態顯示格式
TIMESTAMP(14)YYYYMMDDHHMMSS
TIMESTAMP(12)YYMMDDHHMMSS
TIMESTAMP(10)YYMMDDHHMM
TIMESTAMP(8)YYYYMMDD
TIMESTAMP(6)YYMMDD
TIMESTAMP(4)YYMM
TIMESTAMP(2)YY

字串型態
型態空間需求最大長度
CHAR(M)M bytesM bytes
VARCHAR(M)L+1 bytesM bytes
TINYBLOB, TINYTEXTL+1 bytes28-1 bytes
BLOB, TEXTL+2 bytes216-1 bytes
MEDIUMBLOB, MEDIUMTEXTL+3 bytes224-1 bytes
LONGBLOB, LONGTEXTL+4 bytes232-1 bytes
ENUM('value1','value2',...)1 or 2 bytes65535 個成員
SET('value1','value2',...)1, 2, 3, 4, or 8 bytes64 個成員
 上表中的 L 代表「實際儲存的空間大小」,上述多種型態的空間需求都與實際存入的空間大小有關,意即,它們的空間需求是變動的。

CHAR 與 VARCHAR
 使用 CHAR 及 VARCHAR 型態時,必須宣告「最大儲存長度」,就是上表中的 M。這兩種型態是相似的,所能儲存的最大長度都是 255 bytes。其相異之處在於 CHAR 是個固定長度的型態,而 VARCHAR 是個長度可變的型態。我們從下表來看兩者在資料儲存上的表現:
字串內容CHAR(4)空間需求VARCHAR(4)空間需求
'''????'4 bytes''1 byte
'ab''ab??'4 bytes'ab'3 bytes
'abcd''abcd'4 bytes'abcd'5 bytes
'abcdefgh''abcd'4 bytes'abcd'5 bytes
 由於使用 CHAR 型態儲存資料時,MySQL 會以空白字元填補至最大儲存長度,所以無論存入的內容為何,所需的儲存空間都是固定的。當資料內容少於最大儲存長度時,VARCHAR 將可以有效地節省空間,這是它最大的優點;檢索時擁有較佳的效率,則是 CHAR 的長處。
 VARCHAR 和各類 TEXT 與 BLOB 都是長度可變的型態。當一資料表中同時選用 CHAR 和這類長度可變的型態時,CHAR 會被自動改為 VARCHAR,除非它的最大儲存長度少於 4。
 另一方面,若資料表中 VARCHAR 欄位的最大儲存長度少於 4 時,其型態也會被自動改為 CHAR。因為少於 4 bytes 的欄位在節省空間方面,實在沒多大的效果,不如改為 CHAR 以加快檢索的速度。

TEXT 與 BLOB
 BLOB 的全名是「binary large object」,與 TEXT 一樣,都是用來儲存長度較長的字串或是二元資料。兩者大同小異,唯一的差別在於,TEXT 是有區分大小寫的,而 BLOB 不分。

ENUM 與 SET
 ENUM 與 SET 是特別的字串型態,有人稱之為「列舉(enumeration)」型態。這兩種欄位的值只能從固定的項目中挑選,不能隨心所欲的存入資料。舉個例子來看,我們想調查使用者的性別與年齡分布狀況,所以設定了以下兩種欄位:
 sex ENUM("M", "F")
 age ENUM("0-20", "21-30", "31-40", "41-50", "51-100")
 若使用者填答時輸入「男性,32 歲」,我們則要用程式處理它,分別以 sex 的第 1 個選項與 age 的第 3 個選項存入。像 age 這個欄位,它已經將原始的輸入值以分組的形式來儲存,日後我們將無法得知使用者當時所輸入的精確數值。
 ENUM 型態最多可以建立 65535 個不同的成員,而 SET 型態少得多,只能建立 64 個不同的成員。除了「容量」有別之外,兩者還有一項相異之處:SET 型態可以從中挑選一組以上的值,而 ENUM 只能選其一。換句話說,ENUM 型態是單選,而 SET 型態則是複選。
 subject SET("Chinese", "English", "Math", "Music", "Art", "Sport")
 這是一個 SET 型態的例子,使用者在從上述 subject 欄位挑選所修習的科目時,就可以同時挑選多個項目。


摘自:http://chensh.loxa.edu.tw/php/C_2.php

wibiya widget