變量分爲用戶變量與系統變量。
用戶變量:
用戶變量與數據庫連接有關,在這個連接中聲明的變量,在連接斷開的時候,就會消失。
在此連接中聲明的變量無法在另一連接中使用。
用戶變量的變量名的形式爲@varname的形式。
名字必須以@開頭。
聲明變量的時候需要使用set語句,比如下面的語句聲明瞭一個名爲@a的變量。
set @a = 1;
聲明一個名爲@a的變量,並將它賦值爲1,mysql裏面的變量是不嚴格限制數據類型的,它的數據類型根據你賦給它的值而隨時變化 。
(SQL SERVER中使用declare語句聲明變量,且嚴格限制數據類型。)
我們還可以使用select 語句爲變量賦值 。
比如:
set @name = '';
select @name:=password from user limit 0,1;
(注意等於號前面有一個冒號,後面的limit 0,1是用來限制返回結果的,相當於SQL SERVER裏面的top 1)
如果直接寫:
select @name:=password from user;
如果這個查詢返回多個值的話,那@name變量的值就是最後一條記錄的password字段的值 。
系統變量:
系統變量又分爲全局變量與會話變量。
全局變量在MYSQL啓動的時候由服務器自動將它們初始化爲默認值,這些默認值可以通過更改my.ini這個文件來更改。
會話變量在每次建立一個新的連接的時候,由MYSQL來初始化。MYSQL會將當前所有全局變量的值複製一份。來做爲會話變量。
(也就是說,如果在建立會話以後,沒有手動更改過會話變量與全局變量的值,那所有這些變量的值都是一樣的。)
全局變量與會話變量的區別就在於,對全局變量的修改會影響到整個服務器,但是對會話變量的修改,只會影響到當前的會話
(也就是當前的數據庫連接)。
我們可以利用
show session variables;
語句將所有的會話變量輸出:
(可以簡寫爲show variables,沒有指定是輸出全局變量還是會話變量的話,默認就輸出會話變量。)
mysql> show global variables;
+---------------------------------+----------------------------------------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------------------------------------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
..................................省略..............................
| tmpdir | C:\WINDOWS\TEMP\ |
| transaction_alloc_block_size | 8192 |
| transaction_prealloc_size | 4096 |
| tx_isolation | REPEATABLE-READ |
| updatable_views_with_limit | YES |
| version | 5.0.67-community-nt |
| version_comment | MySQL Community Edition (GPL) |
| version_compile_machine | ia32 |
| version_compile_os | Win32 |
| wait_timeout | 28800 |
+---------------------------------+----------------------------------------------------------------+
232 rows in set, 1 warning (0.00 sec)
如果想輸出所有全局變量:
show global variables;
有些系統變量的值是可以利用語句來動態進行更改的,但是有些系統變量的值卻是隻讀的。
對於那些可以更改的系統變量,我們可以利用set語句進行更改。
如果想要更改會話變量的值,利用語句:
set session varname = value;
或者set @@session.varname = value;
比如:
mysql> set session sort_buffer_size = 40000;
Query OK, 0 rows affected(0.00 sec)
如果想要更改全局變量的值,將session改成global:
set global sort_buffer_size = 40000;
set @@global.sort_buffer_size = 40000;
不過要想更改全局變量的值,需要擁有SUPER權限 。
(
注意,ROOT只是一個內置的賬號,而不是一種權限 ,
這個賬號擁有了MYSQL數據庫裏的所有權限。任何賬號只要它擁有了名爲SUPER的這個權限,
就可以更改全局變量的值,正如任何用戶只要擁有FILE權限就可以調用load_file或者
into outfile ,into dumpfile,load data infile一樣。
)
利用select語句我們可以查詢單個會話變量或者全局變量的值:
select @@session.sort_buffer_size
select @@global.sort_buffer_size
select @@global.tmpdir
凡是上面提到的session,都可以用local這個關鍵字來代替。
比如:
select @@local.sort_buffer_size
local 是 session的近義詞。
無論是在設置系統變量還是查詢系統變量值的時候,只要沒有指定到底是全局變量還是會話變量。
都當做會話變量來處理。
比如:
set @@sort_buffer_size = 50000;
select @@sort_buffer_size;
上面都沒有指定是GLOBAL還是SESSION,所以全部當做SESSION處理。
還有一個結構式系統變量,這個不知道幹什麼用的,不記了。