求助前辈们关于set的用法

晓秦 2011-11-02 07:19:24
刚开始研究数据库mysql。遇到一个SQL语句,不甚明白,请前辈们解释下,感激不尽。

语句:

mysql_query("set names 'gb2312'");

刚开始的时候,我以为set是将我用的那个数据库里面的一个表里的name字段的字符集设置成'gb2312';于是自作主张地去掉了上面那个句子里面names后面的s。结果返回FASLE。上网找了下,但是关于这个set的几乎没有啊,大虾们能不能帮我看看,这句到底是将什么设置为'gb2312'?
...全文
92 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2011-11-02
  • 打赏
  • 举报
回复
[Quote]13.5.3. SET语法
SET variable_assignment [, variable_assignment] ...

variable_assignment:
user_var_name = expr
| [GLOBAL | SESSION] system_var_name = expr
| @@[global. | session.]system_var_name = expr
SET用于设置不同类型的变量。这些变量会影响服务器或客户端的操作。SET可以用于向用户变量或系统变量赋值。

用于分配账户密码的SET PASSWORD语句在13.5.1.5节,“SET PASSWORD语法”中进行了讨论。

多数系统变量可以在运行时间被更改。可以被动态设置的系统变量在5.3.3.1节,“动态系统变量”中进行了讨论。

注释:旧版本的MySQL采用SET OPTION作为这个命令,但是由于有了SET,现在不赞成使用SET OPTION。

以下例子显示了您可以用于设置变量的不同语法。

用户变量可以被写作@var_name,并可以进行如下设置:

SET @var_name = expr;
在9.3节,“用户变量”中给出了有关用户变量的更多信息。

系统变量可以被作为var_name引用到SET语句中。在名称的前面可以自选地添加GLOBAL或@@global,以明确地指示该变量是全局变量。或者在名称前面添加SESSION, @@session,或@@,以指示它是一个会话变量。LOCAL和@@local是SESSION和@@session地同义词。如果没有修改符,则SET设置会话变量。

支持系统变量的@@var_name语法,以便使MySQL语法与其它数据库系统相兼容。

如果您在同一个语句中设置多个系统变量,则最后一个GLOBAL或SESSION选项被用于没有指定模式的变量。

SET sort_buffer_size=10000;
SET @@local.sort_buffer_size=10000;
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
如果您使用SESSION(默认情况)设置一个系统变量,则该值仍然有效,直到当前会话结束为止,或者直到您吧变量设置为一个不同的值为止。如果您使用GLOBAL(要求SUPER权限)来设置一个系统变量,则该值被记住,并被用于新的连接,直到服务器重新启动为止。如果您想要进行永久式变量设置,您应该把它放入一个选项文件。请参见4.3.2节,“使用选项文件”。

为了防止不正确的使用,如果您使用SET GLOBAL时同时使用了一个只能与SET SESSION同时使用的变量,或者如果您在设置一个全局变量时未指定GLOBAL(或@@),则MySQL会产生一个错误。

如果您想要把一个SESSION变量设置为GLOBAL值或把一个GLOBAL值设置为内部MySQL默认值,需使用DEFAULT关键词。例如,在把max_join_size会话值设置为全局值时,以下两个语句是一样的:

SET max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;
您可以使用SHOW VARIABLES来得到系统变量清单。(见13.5.4.21节,“SHOW VARIABLES语法”。)要获得与样式匹配的一个具体的变量名称或者名称清单,需使用LIKE子句,使用方法如下:

SHOW VARIABLES LIKE 'max_join_size';
SHOW GLOBAL VARIABLES LIKE 'max_join_size';
要得到名称与样式匹配的变量的清单,需使用通配符‘%’:

SHOW VARIABLES LIKE 'have%';
SHOW GLOBAL VARIABLES LIKE 'have%';
通配符可以被用于相匹配的样式中的任何位置。

您也可以通过使用@@[global.|local.]var_name语法和SELECT来得到值:

SELECT @@max_join_size, @@global.max_join_size;
当您使用SELECT @@var_name(即您不指定全局、会话或本地)来恢复一个变量时,则MySQL会返回SESSION值(如果存在)或者GLOBAL值。

以下清单用于描述带有非标准语法的变量,或描述在系统变量清单中(见5.3.3节,“服务器系统变量”。)中没有描述的变量。尽管这些变量没有被SHOW VARIABLES显示,但是您可以使用SELECT来获得它们的值(例外情况是,使用CHARACTER SET和SET NAMES)。例如:

mysql> SELECT @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
| 1 |
+--------------+
· AUTOCOMMIT = {0 | 1}

设置autocommit模式。如果设置为1,则所有对表的更改会立刻生效。如果设置为0,则您必须使用COMMIT来接受一个事务,或使用ROLLBACK来取消它。如果您把AUTOCOMMIT模式从0改为1,则MySQL会对开放事务执行一个自动COMMIT。开始一个事务的另一种方法是使用一个START TRANSACTION或BEGIN语句。请参见13.4.1节,“START TRANSACTION, COMMIT和ROLLBACK语法”。

· BIG_TABLES = {0 | 1}

如果设置为1,所有的临时表被存储在磁盘中,而不是存储在储存期中。这样会稍微慢些,但是对于需要一个大型临时表的SELECT操作,不会发生The table tbl_name is full错误。对于一个新连接,默认值为0(使用存储器内部临时表)。通常,您不必设置此变量,因为根据需要,存储器内部表会被自动转换为以磁盘为基础的表。( 注释:本变量以前被命名为SQL_BIG_TABLES。)

· CHARACTER SET {charset_name | DEFAULT}

本语句使用给定的映射为所有来自客户端和指向客户端的字符串建立映射。您可以通过在MySQL源分布中编辑sql/convert.cc来添加新的映射。SET CHARACTER SET用于设定三个会话系统变量:character_set_client和character_set_results被设置为给定的字符集,character_set_connection被设置为character_set_database值。

可以通过使用DEFAULT值恢复默认的映射。

注意,SET CHARACTER SET的语法与设置其它选项的语法不同。

· FOREIGN_KEY_CHECKS = {0 | 1}

如果设置为1(默认情况),则检查InnoDB表的外键限制条件。如果设置为0,则限制条件被忽略。如果重新载入InnoDB表时按照的顺序与上级/下级目录所要求的顺序不同,此时禁用外键检查是有用的。请参见15.2.6.4节,“FOREIGN KEY约束”。

· IDENTITY = value

该变量是LAST_INSERT_ID变量的同义词。该变量的作用是保持与其它数据库兼容。您可以使用SELECT @@IDENTITY读取其值,并可以使用SET IDENTITY设置它。

· INSERT_ID = value

用于设置将被以下INSERT或ALTER TABLE语句使用的值。此值在插入一个AUTO_INCREMENT值时使用。本语句主要和二进制日志同时使用。

· LAST_INSERT_ID = value

用于设定将从LAST_INSERT_ID()被返回的值。当您在用于更新表的语句中使用LAST_INSERT_ID()时,它被存储在二进制日志中。设置此变量不会更新由mysql_insert_id() C API函数返回的值。

· NAMES {'charset_name' | DEFAULT}

SET NAMES用于把三个会话系统变量character_set_client, character_set_connection和character_set_results设置为给定的字符集。把character_set_connection设置为charset_name时,同时把collation_connection设置为charset_name的默认整序。

使用一个DEFAULT值可以恢复默认的映射。

注意,SET NAMES的语法与用于设置其它选项的语法不同。

· ONE_SHOT

这不是一个服务器系统变量,但是它可以被用来影响用于设置字符集、整序和时区的变量的效果。ONE_SHOT主要被用于复制:mysqlbinlog使用SET ONE_SHOT来暂时地修改字符集、整序和时区变量的值,以反映出它们原先的值。

您不能在使用ONE_SHOT时使用除允许的变量以外的变量;如果您这么做,您会得到如下错误:

mysql> SET ONE_SHOT max_allowed_packet = 1;
ERROR 1382 (HY000): The 'SET ONE_SHOT' syntax is reserved for purposes internal to the MySQL server
如果同时使用ONE_SHOT和被允许的变量
[/Quote]
ACMAIN_CHM 2011-11-02
  • 打赏
  • 举报
回复
为什么不看MYSQL的官方手册? 免费的。
[Quote]
你能够调整这些变量的设置,或可以依赖默认值(这样,你可以跳过本章)。

有两个语句影响连接字符集:

SET NAMES 'charset_name'
SET CHARACTER SET charset_name
SET NAMES显示客户端发送的SQL语句中使用什么字符集。因此,SET NAMES 'cp1251'语句告诉服务器“将来从这个客户端传来的信息采用字符集cp1251”。它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一个SELECT语句,它表示列值使用了什么字符集。)

SET NAMES 'x'语句与这三个语句等价:

mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET character_set_connection = x;
将x设置为character_set_connection也就设置了collation_connection是x的默认校对规则。

SET CHARACTER SET语句是类似的,但是为 默认数据库设置连接字符集和校对规则。SET CHARACTER SET x语句与这三个语句等价:

mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET collation_connection = @@collation_database;
当一个客户端连接时,它向服务器发送希望使用的字符集名称。服务器为那个字符集设置character_set_client、character_set_results和 character_set_connection变量。(实际上,服务器为使用该字符集执行一个SET NAMES操作。)

[/Quote]

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧