mysql> select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
用户变量可以用于表达式所允许的任何地方。注意,这在数字必须明确指定的语境中并不适用,例如,在 select 的 limit 子句中或一个 load data 语句的 ignore number lines 的子句中。
注意:在一个 select 语句中,各个表达式只有在它被送到客户端时才能被求值。这就意味着,在 having、group by 或 order by 子句中,你不能使用一个包含在 select 部份所设置变量的表达式。例如:下面的语句将不会按预期的运作:
mysql> select (@aa:=id) as a, (@aa+3) as b from table_name having b=5;
原因是因为 @aa 不会是当前行的值,而是前一个符合条件的行的 id 值。
规则就是在同一语句中决不赋值 和 使用同一个变量。
6.1.5 系统变量
从 mysql 4.0.3 开始,我们提供了对大量的系统变量和连接变量的更好的访问方式。你可以不需要关闭服务器就可以更改其中的大部变量值。
系统变量可分为两种类型:线程特定(thread-specific)或称为连接特定(connection-specific)变量,它们是当前连接唯一的;全局变量,它们用于设置全局事件。全局变量也同样被用于设置一个新连接的相应线程特定变量的初始值。
当 mysqld 启动时,所有的全局变量以命令行参数和选项文件内容初始化。可以通过 set global 命令更改这些值。当一个新的连接线程被建立时,将以全局变量值初始化线程特定变量,直到你执行一个新的 set global 命令时,线程特定变量才会改变。
为了设置一个 全局(global) 变量值,可以使用下面的任一句法:(在这里,我们以 sort_buffer_size 变量作为一个示例)
set global sort_buffer_size=value; set @@global.sort_buffer_size=value;
为了设置一个 会话(session) 变量的值,可以使用下面任一句法:
set session sort_buffer_size=value; set @@session.sort_buffer_size=value; set sort_buffer_size=value;
如果你没有明确指定 global 或 session,那么默认地将是设置 session。查看章节 5.5.6 set 句法。
local 是 session 的同义词。
通过下面的任一命令可以检索到一个 全局(global) 变量值:
select @@global.sort_buffer_size; show global variables like 'sort_buffer_size';
通过下面的任一命令可以检索到一个 会话(session) 变量值:
select @@session.sort_buffer_size; show session variables like 'sort_buffer_size';
当 检索 一个变量值时使用 @@variable_name 句法,或没有指定 global 或 session 时,如果线程特定(thread-specific)的 (session) 值存在,mysql 将返回它。如果不存在,那么 mysql 将返回全局变量值。
在设置 全局(global) 变量而不是在检索他们的时候需要使用 global ,是为了在之后引用一个同名的线程特定(thread-specific)变量或删除同名的一个线程特定(thread-specific)变量时不至发生问题。在这种情况下,你可能无意间改变整个服务器的状态而不是你自己的连接。
下面的列表是你可以使用 global 或 session 对它们进行更改和检索的所有变量。
| 变量名 | 变量值类型 | 变量类型 |
| autocommit | bool | session |
| big_tables | bool | session |
| binlog_cache_size | num | global |
| bulk_insert_buffer_size | num | global | session |
| concurrent_insert | bool | global |
| connect_timeout | num | global |
| convert_character_set | string | session |
| delay_key_write | off | on | all | global |
| delayed_insert_limit | num | global |
| delayed_insert_timeout | num | global |
| delayed_queue_size | num | global |
| error_count | num | local |
| flush | bool | global |
| flush_time | num | global |
| foreign_key_checks | bool | session |
| identity | num | session |
| insert_id | bool | session |
| interactive_timeout | num | global | session |
| join_buffer_size | num | global | session |
| key_buffer_size | num | global |
| last_insert_id | bool | session |
| local_infile | bool | global |
| log_warnings | bool | global |
| long_query_time | num | global | session |
| low_priority_updates | bool | global | session |
| max_allowed_packet | num | global | session |
| max_binlog_cache_size | num | global |
| max_binlog_size | num | global |
| max_connect_errors | num | global |
| max_connections | num | global |
| max_error_count | num | global | session |
| max_delayed_threads | num | global |
| max_heap_table_size | num | global | session |
| max_join_size | num | global | session |
| max_sort_length | num | global | session |
| max_tmp_tables | num | global |
| max_user_connections | num | global |
| max_write_lock_count | num | global |
| myisam_max_extra_sort_file_size | num | global | session |
| myisam_max_sort_file_size | num | global | session |
| myisam_sort_buffer_size | num | global | session |
| net_buffer_length | num | global | session |
| net_read_timeout | num | global | session |
| net_retry_count | num | global | session |
| net_write_timeout | num | global | session |
| query_cache_limit | num | global |
| query_cache_size | num | global |
| query_cache_type | enum | global |
| read_buffer_size | num | global | session |
| read_rnd_buffer_size | num | global | session |
| rpl_recovery_rank | num | global |
| safe_show_database | bool | global |
| server_id | num | global |
| slave_compressed_protocol | bool | global |
| slave_net_timeout | num | global |
| slow_launch_time | num | global |
| sort_buffer_size | num | global | session |
| sql_auto_is_null | bool | session |
| sql_big_selects | bool | session |
| sql_big_tables | bool | session |
| sql_buffer_result | bool | session |
| sql_log_binlog | bool | session |
| sql_log_off | bool | session |
| sql_log_update | bool | session |
| sql_low_priority_updates | bool | global | session |
| sql_max_join_size | num | global | session |
| sql_quote_show_create | bool | session |
| sql_safe_updates | bool | session |
| sql_select_limit | bool | session |
| sql_slave_skip_counter | num | global |
| sql_warnings | bool | session |
| table_cache | num | global |
| table_type | enum | global | session |
| thread_cache_size | num | global |
| timestamp | bool | session |
| tmp_table_size | enum | global | session |
| tx_isolation | enum | global | session |
| version | string | global |
| wait_timeout | num | global | session |
| warning_count | num | local |
| unique_checks | bool | session |
以 num 标记的变量可以设置一个数字值。以 bool 标记的变量可以设置 0、1、on 或 off。enum 类型的变量通常是设置为该变量的某一个可用值,但也可以设置为相对应的数字。(enum 的第一个值为 0)。
下面是某些变量的描述:
| 变量 | 描述 |
| identity | last_insert_id 的别名 (sybase 兼容) |
| sql_low_priority_updates | low_priority_updates 的别名 |
| sql_max_join_size | max_join_size 的别名 |
| delay_key_write_for_all_tables | 如它与 delay_key_write 一起被设置,那么所有新打开的 myisam 表将使用 delayed key writes. |
| version | version() 的别名 (sybase (?) 兼容) |