mysql字符集调整


       mysql4.1以后版本都支持多字符集的支持,但是安装默认的字符集竟然是 latin1这个瑞典文,所以很多人想安装discuz等论坛为gbk、utf-8等字符集的论坛就出现了一些问题。最近我在网上找了一些资料,加上自己又专门在一台linux服务器上试验了两天的经历,基本解决了字符集的问题,现将我的心得写出来,供广大网游参考。

     一、原理篇:
           
             mysql服务器中有六个关键位置使用了字符集的概念,他们是: client 、connection、database、results、server 、system。

             a、其中client是客户端使用的字符集,相当于网页中的字符集设置如下

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">。
       b、其中的connection是连接数据库的字符集设置类型,如果php没有指明连接数据库使用的字符集类型
就按照服务器端默认的字符集设置。
       c、其中database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装
时指定的字符集设置。
       d、results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
       e、server是服务器安装时指定的默认字符集设定。
       f、system是数据库系统使用的字符集设定。
      
      system一般默认是utf-8字符集,server是最高的字符集设定,database没有单独设定就按照server的字符
集设定,其他都是按照server的设定设置字符集。还有,数据库内的每个表和字段也都有字符集的概念,一般都
是根据上一级结构决定自身的字符集,比如表就根据database库的设定决定自己的字符集,字段根据表来决定自己
的字符集。

   二、统一字符集的方法:(以utf-8字符集为例,因为他是目前支持文字种类最广的字符集)

      1、彻底解决字符集的方法:

       要彻底解决字符集的方法就是让mysql在安装的时候就是用utf-8的字符集设定,这样可以使上面的六个关键
点的编码都为utf-8。

      a、 在windows下安装mysql有提示可以选择字符集,我们选择utf-8就可以了。

      b、在linux下有三种安装方法,第一种是rpm包安装,这种因为我没有使用过所以没有发言权。

         第二种为可执行程序安装,这种安装因为已经被编译成了latin1这种瑞典语的字符集,所以无法完全解决字
符集问题,这个版本我们后面会讲到怎么解决字符集问题。
         第三种为源码自行编译安装,这种安装可以在编译时设置字符集类型,这部分主要讲这种安装方式。

        在编译mysql是我们可以用这样的指令:./configure --




default-character-set=utf8
这样,在编译的时候,就会把mysql的server项编译成utf8的编码,这样这个mysql下建立的所有数据库都将使用utf8
编码存储,所有有关的方面都是utf8编码。


      2、局部坚决字符集的方法:
 
        如果遇到自己的数据库使用的是默认安装的




latin1字符集的(很奇怪为什么mysql要使用这么个默认字符集)
的情况我们可以这样来解决。

       a、默认请况下我们在mysql命令行使用status指令察看状态,可以看到如下内容:

        mysql> status
--------------
mysql  Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)
Connection id:          62
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.11-beta-log
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1


UNIX socket:            /tmp/mysql.sock
Uptime:                 58 min 23 sec
Threads: 2  Questions: 1067  Slow queries: 0  Opens: 0  Flush tables: 1  Open tables: 75  Queries per second avg: 0.305
--------------



 还可以用SHOW VARIABLES LIKE 'character_set_%';指令察看内容如下:

+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
| character_set_database   | latin1 |
| character_set_filesystem | binary |
| character_set_results    | latin1 |
| character_set_server     | latin1 |
| character_set_system     | utf8   |


| character_sets_dir       | /usr/local/src/mysql-5.1.11/share/mysql/charsets/ |
+--------------------------+---------------------------------------------------------------------------+




8 rows in set (0.00 sec)






          这就说明,除system是utf8之外的所有内容的字符集都为latin1,我们怎么样才能使用utf字符集呢?
有人说可以在my.cnf文件的[mysqld]段中加入default-character-set=utf8这一项就可以解决,但经过我的实验,这一条
完全没有必要,以下是增加了这一项后得显示结果。

mysql> status;
--------------
mysql  Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)
Connection id:          62
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.11-beta-log
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    latin1
UNIX socket:            /tmp/mysql.sock
Uptime:                 1 hour 6 min 18 sec
Threads: 2  Questions: 1071  Slow queries: 0  Opens: 0  Flush tables: 1  Open tables: 75  Queries per second avg: 0.269
--------------





mysql> SHOW VARIABLES LIKE 'character_set_%';

+--------------------------+---------------------------------------------------------------------------+
| Variable_name            | Value                                                                     |
+--------------------------+---------------------------------------------------------------------------+
| character_set_client     | latin1                                                                    |
| character_set_connection | latin1                                                                    |
| character_set_database   | utf8                                                                      |
| character_set_filesystem | binary                                                                    |
| character_set_results    | latin1                                                                    |
| character_set_server     | utf8                                                                      |
| character_set_system     | utf8                                                                      |
| character_sets_dir       | /usr/local/src/mysql-5.1.11-beta-linux-i686-glibc23/share/mysql/charsets/ |
+--------------------------+---------------------------------------------------------------------------+


8 rows in set (0.00 sec)


mysql> SHOW VARIABLES LIKE 'collation_%';

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | utf8_general_ci   |
| collation_server     | utf8_general_ci   |
+----------------------+-------------------+

3 rows in set (0.01 sec)

       从上面可以看出,使用了配置文件中修改默认字符集的方法,并没有把client、connection、
results这三项改成utf8,而且在建数据库的时候我们可以通过这样的指令实现数据库的字符集设置:
 CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

       这样此数据库内的所有表和字段都将为utf8字符集编码,所以在配置文件中修改的方法也就失去了意义。
     
     b、我的解决办法。
     我们可以完全无视数据库默认的字符集是什么,我们关心的只有数据库在建立的时候是不是加入了字符集
选择。

(1)使用如下指令建立数据库:
     CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

(2)客户端php程序使用如下方法设定连接所使用的字符集:  
      

PHP程序在查询数据库之前,执行mysql_query("set names utf8;");


      例子:

  1. <?php
  2. mysql_connect ( ' localhost ' , ' user ' , ' password ' ) ;
  3. mysql_select_db ( ' my_db ' ) ;
  4.  
  5. //请注意,这步很关键,如果没有这步,所有的数据读写都会不正确的
  6. //它的作用是设置本次数据库联接过程中,数据传输的默认字符集
  7. mysql_query ( " set names utf8; " ) ;
  8.  
  9. //必须将gb2312(本地编码)转换成utf-8,也可以使用iconv()函数
  10. mysql_query ( mb_convet_encoding ( " insert into my_table values('测试'); " , " utf-8 " , " gb2312 " )) ;
  11. ?>
     (3)如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中
文在命令行工具中插入数据,并且可以直接显示出来.而不要使用gb2312或者gbk等字符集,如果担心查询
排序等问题,可以使用binary属性约束,例如:


create table my_table ( name varchar(20) binary not null default '')
type=myisam default charset latin1;
   自此,使用utf8字符集的完整的例子结束了。

     三、旧数据升级办法

    (1)导出数据库:
	mysqldump -uroot -p123456 
	--default-character-set=latin1 --set-charset=utf8 --opt olddatabase > newdatabase.sql



    (2)修改newdatabase.sql,在文件开头增加一条sql语句: “SET NAMES utf8;”,保存。

    (3)mysql -hlocalhost -uroot my_db < newdatabase.sql




基于遗传算法的微电网调度(风、光、蓄电池、微型燃气轮机)(Matlab代码实现)内容概要:本文档介绍了基于遗传算法的微电网调度模型,涵盖风能、太阳能、蓄电池和微型燃气轮机等多种能源形式,并通过Matlab代码实现系统优化调度。该模型旨在解决微电网中多能源协调运行的问题,优化能源分配,降低运行成本,提高可再生能源利用率,同时考虑系统稳定性与经济性。文中详细阐述了遗传算法在求解微电网多目标优化问题中的应用,包括编码方式、适应度函数设计、约束处理及算法流程,并提供了完整的仿真代码供复现与学习。此外,文档还列举了大量相关电力系统优化案例,如负荷预测、储能配置、潮流计算等,展示了广泛的应用背景和技术支撑。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能电网优化研究的工程技术人员。; 使用场景及目标:①学习遗传算法在微电网调度中的具体实现方法;②掌握多能源系统建模与优化调度的技术路线;③为科研项目、毕业设计或实际工程提供可复用的代码框架与算法参考; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注目标函数构建与约束条件处理,同时可参考文档中提供的其他优化案例进行拓展学习,以提升综合应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值