??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲伊人久久大香线蕉AV,国产国拍亚洲精品mv在线观看 ,亚洲а∨天堂久久精品http://www.tkk7.com/jjwwhmm/articles/218314.htmlponyponyTue, 29 Jul 2008 03:39:00 GMThttp://www.tkk7.com/jjwwhmm/articles/218314.htmlhttp://www.tkk7.com/jjwwhmm/comments/218314.htmlhttp://www.tkk7.com/jjwwhmm/articles/218314.html#Feedback0http://www.tkk7.com/jjwwhmm/comments/commentRss/218314.htmlhttp://www.tkk7.com/jjwwhmm/services/trackbacks/218314.html某日Q老师在课堂上惌考学生们的智商,问一个男?“树上有十只鸟Q开枪打M只,q剩几只Q?#8221; 
男孩反问:“是无声枪么?” 
“不是?#8221; 
“枪声有多大?” 
“80~100分贝?#8221; 
“那就是说会震的x|” 
“是?#8221; 
“在这个城市里打鸟犯不犯法Q?#8221; 
‘不犯?#8221; 
“您确定那只鸟真的被打dQ?#8221; 
“定?#8221;老师已经不耐烦了,”拜托Q你告诉我还剩几只就行了QOKQ?#8221; 
“OK。鸟里有没有聋子Q?#8221; 
“没有?#8221; 
“有没有关在笼子里的?” 
“没有?#8221; 
“边上q有没有其他的树Q树上还有没有其他鸟Q?#8221; 
“没有?#8221; 
“方圆十里呢?” 
“p么一|!” 
“有没有残疾或饿的飞不动的鸟?” 
“没有Q都w体倍棒?#8221; 
“不怀孕肚子里的小鸟?” 
“都是公的?#8221; 
“都不可能怀孕?” 
“………Q决不可能?#8221; 
“打鸟的h眼里有没有花Q保证是十只Q?#8221; 
“没有花,十只?#8221; 
老师脑门上的汗已l流下来了,下课铃响P但男孩仍l箋?“有没有傻的不怕死的?” 
“都怕死?#8221; 
“有没有因为情侣被打中Q自q下来的?” 
“W蛋Q之前不是说都是公的?” 
“同志可不可以?” 
“…………Q性取向都很正?” 
“会不会一枪打M只?” 
“不会?#8221; 
“一枪打M只呢Q?#8221; 
“不会?#8221; 
“四只呢?” 
“更不?” 
“五只呢?” 
“l对不会!!!” 
“那六只L可能吧?” 
“除非你他妈的是猪生的才有可能!” 
“…好吧Q那么所有的鸟都可以自由zd么?” 
“完全可以?#8221; 
“它们受到惊吓起飞时会不会惊慌失措而互相撞上?” 
“不会Q每只鸟都装有卫星导航系l,而且可以自动飞行?#8221; 
“恩,如果您的回答没有骗hQ?#8221;学生满怀信心的回{,“打死的鸟要是挂在树上没掉下来Q那么就剩一只,如果掉下来,׃只不剩?#8221; 
老师当即? 


pony 2008-07-29 11:39 发表评论
]]>
(转蝲)openssl的man中文文档http://www.tkk7.com/jjwwhmm/articles/195853.htmlponyponyFri, 25 Apr 2008 02:07:00 GMThttp://www.tkk7.com/jjwwhmm/articles/195853.htmlhttp://www.tkk7.com/jjwwhmm/comments/195853.htmlhttp://www.tkk7.com/jjwwhmm/articles/195853.html#Feedback0http://www.tkk7.com/jjwwhmm/comments/commentRss/195853.htmlhttp://www.tkk7.com/jjwwhmm/services/trackbacks/195853.html阅读全文

pony 2008-04-25 10:07 发表评论
]]>
(转蝲 )中国Z能不看,英法{国抵制北京奥运的真实原因!http://www.tkk7.com/jjwwhmm/articles/194304.htmlponyponySun, 20 Apr 2008 05:20:00 GMThttp://www.tkk7.com/jjwwhmm/articles/194304.htmlhttp://www.tkk7.com/jjwwhmm/comments/194304.htmlhttp://www.tkk7.com/jjwwhmm/articles/194304.html#Feedback0http://www.tkk7.com/jjwwhmm/comments/commentRss/194304.htmlhttp://www.tkk7.com/jjwwhmm/services/trackbacks/194304.html西方国家q次Z么会如次的团l?Ƨ洲的d国、法国,一般是不会冒着q样的风险得|中国这个经大国的。伊拉克? 争时德国和法国都和中国站在一边,不支持美国对伊动武。ؓ伊拉克而得|美国,不符合他们的国家利益啊。法?0q前Z不得|中国,l止了对台军售,损失 了几十亿的收入。而ؓ什么今天会冒着q么大的风险公然与中国ؓ敌?隑ֈ是Z和自己根本不相干的西藏和奥运Q?


而另一个值得让h思考的问题是,一向是西方老大的美国,Z么这一ơ这么低调?让英、法、d在前 台唱主角Q对于西藏,西方国家很清楚,再怎么闹,中国也不可能做出让步。对于奥q,他们也很清楚Q就西方国家没有一个领gh出席北京奥运会,中国也就? 面子上过不去|了Q对中国有实质媄响吗Q没有。所以,西藏只是一个幌子,奥运也只是一个幌子。那么他们到底想从中国得C么?


西方国家正面临着10q来l济陷入衰退的危险,他们需要有一个有实力的国家ؓq次西方l济的衰退 买单。不a而喻Q他们不U而同的想C中国? 做ؓ一个普通老百姓,我对国际l济没有什么研IӞ?8q一开始我q是隐约C国经面临的危险Q现在也想起了温ȝ说过的一句话Q?8q也许是中国l? 最困难的一q。现在想h在进行的q场闹剧Q真的有点让人毛骨耸然了。美国不是低调,是很冷静Q他们早已经不露声色的出招了Q?


1、美元贬倹{因为美元贬|人民币升|中国16000亿美元的外汇储备已经人间蒸发? 3000亿美元,而且q在l箋蒸发中。更要命的是Q由于h民币升|中国出口产品成本增加Q沉重的打击中国的出口,许多企业面倒闭的危险。因Z国企? 的倒闭Q西方国家生产企业就可以开始生产复苏?


2、通过高a价以拖跨中国l济。中国经的高速发展需要大量的q品原aQ而西方国家则不断的提高石油储备,造成高a价一直持l,以增加中国经徏讄成本。这是国Z么要打伊拉克、打伊朗的原因:控制xa是控制了经命脉?


3、涨中国金融沫。h民币升|大量热钱自然要涌入中国,造成中国高成本、高币值的l济? 沫。或许这是Z么政府就是背着千夫所指都l不救市的原因,是Z打击国际投机资本在中国的恶意圈钱行ؓQ而另一斚w却不得不面对成千上万痛不Ʋ生 的股民的N而有可能造成国内C会动荡的危险。现在看了,什么西藏事件、抵制奥q都是不ؓ道的事?


所以,“西藏”?#8220;奥运”只是西方国家l架的两?#8220;”Q他们真正的目的不是西藏Q也不是奥运Q而是以此挟,要中国ؓ他们的经衰退买单。不买单Q搞׃Q要d家一h。买单:坐下来谈Q你{应我我息事宁人!

[ 转自铁血C֌ http://bbs.tiexue.net/ ]


中国政府的冷静是对的Q死L住经徏设这个中心不动摇才是关键。经如果一跨,那就什么都? 了? 国民要冷静,要相互理解,不要l政府出N。还是那句话Q发展才是硬道理Q压倒一切的是稳定。一个普通的中国人都能预料到Q我怿政府能从容应寏V我们要 支持政府打赢q场表面上看h是舆论战Q而事实上是经的战争


我们需要更团结 希望大家奔走先告


1、多省a 多乘坐公׃通出?能做车就不要开?能开H户׃要开 I


2、多省电 路灯不用关掉, 能用x׃要开音箱Q家电不用就要把整个开x下来 又省电又安全 希望政府把夜景工E的灯光关?


3、支持国?能买到国货就不要买外国货 促进内需 pl自׃h?


4、努力工?多开发和刉更好的产品 实业才是救国之本

[ 转自铁血C֌ http://bbs.tiexue.net/ ]


5、尊重自?重国h 不要崇洋媚外


6、告诉台?西藏 包括其他民族的青q?Z么我们现在还q么痛苦别的国家看不P因ؓ我们的祖辈太喜欢H里斗,?


7、告诉n边的每一个h 中国只有强大才会有更好的?Q落后就要挨打挨?


8、政府在q步 督促政府更快的进?而不是推C 那样高兴的是日 痛苦的是自己




如果你是一个爱国的中国人,如果你愿意与所有中国h一hq这D艰隄岁月Q请在自己恪守以上原则的同时Q将本文发给更多的朋友。有我们Q中国一定强Q?



pony 2008-04-20 13:20 发表评论
]]>
Mysql 优化的资?攉转蝲)http://www.tkk7.com/jjwwhmm/articles/194128.htmlponyponyFri, 18 Apr 2008 16:37:00 GMThttp://www.tkk7.com/jjwwhmm/articles/194128.htmlhttp://www.tkk7.com/jjwwhmm/comments/194128.htmlhttp://www.tkk7.com/jjwwhmm/articles/194128.html#Feedback0http://www.tkk7.com/jjwwhmm/comments/commentRss/194128.htmlhttp://www.tkk7.com/jjwwhmm/services/trackbacks/194128.html

Mysql 百万U数据优化资?

一、我们可以且应该优化什么?

g

操作pȝ/软g?

SQL服务?讄和查?

应用~程接口(API)

应用E序

--------------------------------------------------------------------------------

二、优化硬?

如果你需要庞大的数据库表(>2G)Q你应该考虑使用64位的gl构Q像Alpha、Sparc或即推出的IA64。因为MySQL内部使用大量64位的整数Q?4位的CPU提供更好的性能?

对大数据库,优化的次序一般是RAM、快速硬盘、CPU能力?

更多的内存通过最常用的键码页面存攑֜内存中可以加速键码的更新?

如果不用事务安?transaction-safe)的表或有大表q且想避免长文g查,一台UPSp够在甉|故障时让pȝ安全关闭?

对于数据库存攑֜一个专用服务器的系l,应该考虑1G的以太网。gq与吞吐量同样重要?

--------------------------------------------------------------------------------

三、优化磁?

为系l、程序和临时文g配备一个专用磁盘,如果是q行很多修改工作Q将更新日志和事务日志放在专用磁盘上?br /> 低寻道时间对数据库磁盘非帔R要。对与大表,你可以估计你需要log(行数)/log(索引块长?3*2/(键码长度 + 数据指针长度))+1ơ寻到才能找C行。对于有500000行的表,索引Mediun intcd的列Q需要log(500000) / log(1024/3*2/(3 + 2))+1=4ơ寻道。上q烦引需?00000*7*3/2=5.2M的空间。实际上Q大多数块将被缓存,所以大概只需?-2ơ寻道?br /> 然而对于写入(如上Q,你将需?ơ寻道请求来扑ֈ在哪里存放新键码Q而且一般要2ơ寻道来更新索引q写入一行?br /> 对于非常大的数据库,你的应用受到磁盘寻道速度的限Ӟ随着数据量的增加呈N log N数据U递增?br /> 数据库和表分在不同的磁盘上。在MySQL中,你可以ؓ此而用符号链接?br /> 条列盘(RAID 0)提高读和写的吞吐量?br /> 带镜像的条列(RAID 0+1)更安全q提高读取的吞吐量。写入的吞吐量将有所降低?br /> 不要对时文件或可以很容易地重徏的数据所在的盘使用镜像或RAID(除了RAID 0)?br /> 在Linux上,在引导时对磁盘用命令hdparm -m16 -d1以启用同时读写多个扇区和DMA功能。这可以响应时间提?~50%?br /> 在Linux上,用async (默认)和noatime挂蝲盘(mount)?br /> 对于某些特定应用Q可以对某些特定表用内存磁盘,但通常不需要?

--------------------------------------------------------------------------------

四、优化操作系l?

不要交换区。如果内存不I增加更多的内存或配置你的pȝ使用较少内存?br /> 不要使用NFS盘(会有NFS锁定的问??br /> 增加pȝ和MySQL服务器的打开文g数量?在safe_mysqld脚本中加入ulimit -n #)?br /> 增加pȝ的进E和U程数量?br /> 如果你有相对较少的大表,告诉文gpȝ不要文件打在不同的磁道上(Solaris)?br /> 使用支持大文件的文gpȝ(Solaris)?br /> 选择使用哪种文gpȝ。在Linux上的Reiserfs对于打开、读写都非常快。文件检查只需几秒U?

--------------------------------------------------------------------------------

五、选择应用~程接口

PERL
可在不同的操作系l和数据库之间移植?br /> 适宜快速原型?br /> 应该使用DBI/DBD接口?br /> PHP
比PERL易学?br /> 使用比PERL的资源?br /> 通过升到PHP4可以获得更快的速度?br /> C
MySQL的原生接口?br /> 较快q赋予更多的控制?br /> 低层Q所以必M出更多?br /> C++
较高层次Q给你更多的旉来编写应用?br /> 仍在开发中
ODBC
q行在Windows和Unix上?br /> 几乎可在不同的SQL服务器间UL?br /> 较慢。MyODBC只是单的直通驱动程序,比用原生接口?9%?br /> 有很多方法做同样的事。很隑փ很多ODBC驱动E序那样q行Q在不同的领域还有不同的错误?br /> 问题成堆。Microsoft偶尔q会改变接口?br /> 不明朗的未来?Microsoft更推崇OLE而非ODBC)
ODBC
q行在Windows和Unix上?br /> 几乎可在不同的SQL服务器间UL?br /> 较慢。MyODBC只是单的直通驱动程序,比用原生接口?9%?br /> 有很多方法做同样的事。很隑փ很多ODBC驱动E序那样q行Q在不同的领域还有不同的错误?br /> 问题成堆。Microsoft偶尔q会改变接口?br /> 不明朗的未来?Microsoft更推崇OLE而非ODBC)
JDBC
理论上可在不同的操作pȝ何时据库间移植?br /> 可以q行在web客户端?br /> Python和其?br /> 可能不错Q可我们不用它们?

--------------------------------------------------------------------------------

六、优化应?

应该集中_֊解决问题?br /> 在编写应用时Q应该决定什么是最重要的:
速度
操作pȝ间的可移植?br /> SQL服务器间的可UL?br /> 使用持箋的连接?
~存应用中的数据以减SQL服务器的负蝲?br /> 不要查询应用中不需要的列?br /> 不要使用SELECT * FROM table_name...
试应用的所有部分,但将大部分精力放在在可能最坏的合理的负载下的测试整体应用。通过以一U模块化的方式进行,你应该能用一个快?#8220;哑模?#8221;替代扑ֈ的瓶颈,然后很容易地标出下一个瓶颈?br /> 如果在一个批处理中进行大量修改,使用LOCK TABLES。例如将多个UPDATES或DELETES集中在一赗?

--------------------------------------------------------------------------------

七、应该用可UL的应?

Perl DBI/DBD
ODBC
JDBC
Python(或其他有普遍SQL接口的语a)
你应该只使用存在于所有目的SQL服务器中或可以很Ҏ地用其他构造模拟的SQL构造。www.mysql.com上的Crash-me可以帮助你?br /> 为操作系l?SQL服务器编写包装程序来提供~少的功能?

--------------------------------------------------------------------------------

八、如果你需要更快的速度Q你应该Q?

扑և瓉(CPU、磁盘、内存、SQL服务器、操作系l、API或应?q中全力解冟?br /> 使用l予你更快速度/灉|性的扩展?br /> 逐渐了解SQL服务器以便能Z的问题用可能最快的SQL构造ƈ避免瓉?br /> 优化表布局和查询?br /> 使用复制以获得更快的选择(select)速度?br /> 如果你有一个慢速的|络q接数据库,使用压羃客户/服务器协议?br /> 不要x时应用的第一个版本不能完地ULQ在你解决问题时Q你L可以在以后优化它?

--------------------------------------------------------------------------------

九、优化MySQL

挑选编译器和编译选项?br /> 位你的系l寻找最好的启动选项?br /> 通读MySQL参考手册ƈ阅读Paul DuBios的《MySQL》一书?已有中文?译注)
多用EXPLAIN SELECT、SHOW VARIABLES、SHOW STATUS和SHOW PROCESSLIST?br /> 了解查询优化器的工作原理?br /> 优化表的格式?br /> l护你的?myisamchk、CHECK TABLE?OPTIMIZE TABLE)
使用MySQL的扩展功能以让一切快速完成?br /> 如果你注意到了你在很多场合需要某些函敎ͼ~写MySQL UDF函数?br /> 不要使用表或列U的GRANTQ除非你实需要?br /> 购买MySQL技术支持以帮助你解决问题憨W?

--------------------------------------------------------------------------------

十、编译和安装MySQL

通过位你的系l挑选可能最好的~译器,你通常可以获得10-30%的性能提高?br /> 在Linux/Intelq_上,用pgcc(gcc的奔腾芯片优化版)~译MySQL。然而,二进制代码将只能q行在Intel奔腾CPU上?br /> 对于一U特定的q_Q用MySQL参考手册上推荐的优化选项?br /> 一般地Q对特定CPU的原生编译器(如Sparc的Sun Workshop)应该比gcc提供更好的性能Q但不Lq样?br /> 用你用的字符集编译MySQL?br /> 静态编译生成mysqld的执行文??-with-mysqld-ldflags=all-static)q用strip sql/mysqld整理最l的执行文g?br /> 注意Q既然MySQL不用C++扩展Q不带扩展支持编译MySQL赢得巨大的性能提高?br /> 如果操作pȝ支持原生U程Q用原生线E?而不用mit-pthreads)?br /> 用MySQL基准试来测试最l的二进制代码?

--------------------------------------------------------------------------------

十一、维?

如果可能Q偶运行一下OPTIMIZE tableQ这对大量更新的变长行非帔R要?br /> 偶尔用myisamchk -a更新一下表中的键码分布l计。记住在做之前关掉MySQL?br /> 如果有碎片文Ӟ可能值得所有文件复制到另一个磁盘上Q清除原来的盘q拷回文件?br /> 如果遇到问题Q用myisamchk或CHECK table查表?br /> 用mysqladmin -i10 precesslist extended-status监控MySQL的状态?br /> 用MySQL GUI客户E序Q你可以在不同的H口内监控进E列表和状态?br /> 使用mysqladmin debug获得有关锁定和性能的信息?

--------------------------------------------------------------------------------

十二、优化SQL

扬SQL之长Q其它事情交由应用去做。用SQL服务器来做:

扑ևZWHERE子句的行?br /> JOIN?br /> GROUP BY
ORDER BY
DISTINCT

不要使用SQL来做Q?

验数?如日?
成ؓ一只计器

技巧:

明智C用键码?br /> 键码适合搜烦Q但不适合索引列的插入/更新?br /> 保持数据为数据库W三范式Q但不要担心冗余信息或这如果你需要更快的速度Q创建ȝ表?br /> 在大表上不做GROUP BYQ相反创建大表的ȝ表ƈ查询它?br /> UPDATE table set count=count+1 where key_column=constant非常快?br /> 对于大表Q或许最好偶生成ȝ表而不是一直保持ȝ表?br /> 充分利用INSERT的默认倹{?

--------------------------------------------------------------------------------

十三、不同SQL服务器的速度差别Q以U计Q?

+--------------------------+--------+---------+
|通过键码d2000000行: | NT | Linux |
+--------------------------+--------+---------+
|mysql | 367 | 249 |
+--------------------------+--------+---------+
|mysql_odbc | 464 | |
+--------------------------+--------+---------+ 
|db2_odbc | 1206 | |
+--------------------------+--------+---------+ 
|informix_odbc | 121126 | |
+--------------------------+--------+---------+ 
|ms-sql_odbc   | 1634 | |
+--------------------------+--------+---------+
|oracle_odbc | 20800 | |
+--------------------------+--------+---------+ 
|solid_odbc | 877   | |
+--------------------------+--------+---------+
|sybase_odbc | 17614 | |
+--------------------------+--------+---------+ 

+--------------------------+--------+---------+ 
|插入350768行: | NT | Linux |
+--------------------------+--------+---------+
|mysql | 381 | 206 |
+--------------------------+--------+---------+
|mysql_odbc | 619   | |
+--------------------------+--------+---------+
|db2_odbc | 3460  | |
+--------------------------+--------+---------+
|informix_odbc | 2692  | |
+--------------------------+--------+---------+
|ms-sql_odbc | 4012  | |
+--------------------------+--------+---------+
|oracle_odbc | 11291 | |
+--------------------------+--------+---------+ 
|solid_odbc | 1801  | |
+--------------------------+--------+---------+
|sybase_odbc | 4802  | |
+--------------------------+--------+---------+

在上q测试中QMySQL配置8M高速缓存运行,其他数据库以默认安装q行?

--------------------------------------------------------------------------------

十四、重要的MySQL启动选项

back_log 如果需要大量新q接Q修改它?br /> thread_cache_size 如果需要大量新q接Q修改它?br /> key_buffer_size 索引|Q可以设成很大?br /> bdb_cache_size BDB表用的记录和键吗高速缓存?br /> table_cache 如果有很多的表和q发q接Q修改它?br /> delay_key_write 如果需要缓存所有键码写入,讄它?br /> log_slow_queries 扑և需花大量时间的查询?br /> max_heap_table_size 用于GROUP BY
sort_buffer 用于ORDER BY和GROUP BY
myisam_sort_buffer_size 用于REPAIR TABLE
join_buffer_size 在进行无键吗的联l时使用?

--------------------------------------------------------------------------------

十五、优化表

MySQL拥有一套丰富的cd。你应该Ҏ一列尝试用最有效的类型?br /> ANALYSEq程可以帮助你找到表的最优类型:SELECT * FROM table_name PROCEDURE ANALYSE()?br /> 对于不保存NULL值的列用NOT NULLQ这对你想烦引的列尤光要?br /> ISAMcd的表改ؓMyISAM?br /> 如果可能Q用固定的表格式创徏表?br /> 不要索引你不想用的东ѝ?br /> 利用MySQL能按一个烦引的前缀q行查询的事实。如果你有烦引INDEX(a,b)Q你不需要在a上的索引?br /> 不在长CHAR/VARCHAR列上创徏索引Q而只索引列的一个前~以节省存储空间。CREATE TABLE table_name (hostname CHAR(255) not null, index(hostname(10)))
Ҏ个表使用最有效的表格式?br /> 在不同表中保存相同信息的列应该有同样的定义ƈh相同的列名?

--------------------------------------------------------------------------------

十六、MySQL如何ơ存储数?

数据库以目录存储?br /> 表以文g存储?br /> 列以变长或定长格式存储在文g中。对BDB表,数据以页面Ş式存储?br /> 支持Z内存的表?br /> 数据库和表可在不同的盘上用W号q接h?br /> 在Windows上,MySQL支持?sym文g内部W号q接数据库?

--------------------------------------------------------------------------------

十七、MySQL表类?

HEAP表:固定行长的表Q只存储在内存中q用HASH索引q行索引?br /> ISAM表:MySQL 3.22中的早期B-tree表格式?br /> MyIASMQIASM表的新版本,有如下扩展:
二进制层ơ的可移植性?br /> NULL列烦引?br /> 对变长行比ISAM表有更少的碎片?br /> 支持大文件?br /> 更好的烦引压~?br /> 更好的键吗统计分布?br /> 更好和更快的auto_increment处理?br /> 来自Sleepcat的Berkeley DB(BDB)表:事务安全(有BEGIN WORK/COMMIT|ROLLBACK)?

--------------------------------------------------------------------------------

十八、MySQL行类型(专指IASM/MyIASM表)

如果所有列是定长格?没有VARCHAR、BLOB或TEXT)QMySQL以定长表格式创Q否则表以动态长度格式创建?br /> 定长格式比动态长度格式快很多q更安全?br /> 动态长度行格式一般占用较的存储I间Q但如果表频J更斎ͼ会生碎片?br /> 在某些情况下Q不值得所有VARCHAR、BLOB和TEXT列{Ud另一个表中,只是获得主表上的更快速度?br /> 利用myiasmchkQ对ISAMQpack_iasmQ,可以创徏只读压羃表,qɼ盘使用率最,但用慢速磁盘时Q这非常不错。压~表充分地利用将不再更新的日志表

--------------------------------------------------------------------------------

十九、MySQL高速缓存(所有线E共享,一ơ性分配)

键码~存Qkey_buffer_sizeQ默?M?br /> 表缓存:table_cacheQ默?4?br /> U程~存Qthread_cache_sizeQ默??br /> L名缓存:可在~译时修改,默认128?br /> 内存映射表:目前仅用于压~表?br /> 注意QMySQL没有q行高速缓存,而让操作pȝ处理?

--------------------------------------------------------------------------------

二十、MySQL~存区变量(非共享,按需分配Q?

sort_bufferQORDER BY/GROUP BY
record_bufferQ扫描表?br /> join_buffer_sizeQ无键联l?br /> myisam_sort_buffer_sizeQREPAIR TABLE
net_buffer_length:对于读SQL语句q缓存结果?br /> tmp_table_sizeQ时结果的HEAP表大?

--------------------------------------------------------------------------------

二十一、MySQL表高速缓存工作原?

每个MyISAM表的打开实例(instance)使用一个烦引文件和一个数据文件。如果表被两个线E用或在同一条查询中使用两次QMyIASM共享烦引文件而是打开数据文g的另一个实例?br /> 如果所有在高速缓存中的表都在使用Q缓存将临时增加到比表缓存尺寸大些。如果是q样Q下一个被释放的表被关闭?br /> 你可以通过查mysqld的Opened_tables变量以检查表~存是否太小。如果该值太高,你应该增大表高速缓存?

--------------------------------------------------------------------------------

二十二、MySQL扩展/优化-提供更快的速度

使用优化的表cdQHEAP、MyIASM或BDB表)?br /> Ҏ据用优化的列?br /> 如果可能使用定长行?br /> 使用不同的锁定类型(SELECT HIGH_PRIORITYQINSERT LOW_PRIORITYQ?br /> Auto_increment
REPLACE (REPLACE INTO table_name VALUES (...))
INSERT DELAYED
LOAD DATA INFILE / LOAD_FILE()
使用多行INSERT一ơ插入多行?br /> SELECT INTO OUTFILE
LEFT JOIN, STRAIGHT JOIN
LEFT JOIN Q结合IS NULL
ORDER BY可在某些情况下用键码?br /> 如果只查询在一个烦引中的列Q将只用烦引树解决查询?br /> 联结一般比子查询快Q对大多数SQL服务器亦如此Q?br /> LIMIT
SELECT * from table1 WHERE a > 10 LIMIT 10,20
DELETE * from table1 WHERE a > 10 LIMIT 10
foo IN (常数列表) 高度优化?br /> GET_LOCK()/RELEASE_LOCK()
LOCK TABLES
INSERT和SELECT可同时运行?br /> UDF函数可装载进一个正在运行的服务器?br /> 压羃只读表?br /> CREATE TEMPORARY TABLE
CREATE TABLE .. SELECT
带RAID选项的MyIASM表将文g分割成很多文件以H破某些文gpȝ?G限制?br /> Delay_keys
复制功能

--------------------------------------------------------------------------------

二十二、MySQL何时使用索引

对一个键码?gt;, >=, =, <, <=, IF NULL和BETWEEN
SELECT * FROM table_name WHERE key_part1=1 and key_part2 > 5;
SELECT * FROM table_name WHERE key_part1 IS NULL;

当用不以通配W开始的LIKE
SELECT * FROM table_name WHERE key_part1 LIKE 'jani%'

在进行联l时从另一个表中提取行?br /> SELECT * from t1,t2 where t1.col=t2.key_part

扑և指定索引的MAX()或MIN()?br /> SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10

一个键码的前缀使用ORDER BY或GROUP BY
SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3

在所有用在查询中的列是键码的一部分旉
SELECT key_part3 FROM table_name WHERE key_part1=1

--------------------------------------------------------------------------------

二十三、MySQL何时不用烦?

如果MySQL能估计出它将可能比扫描整张表q要快时Q则不用烦引。例如如果key_part1均匀分布??00之间Q下列查询中使用索引׃是很好:
SELECT * FROM table_name where key_part1 > 1 and key_part1 < 90

如果使用HEAP表且不用=搜烦所有键码部分?

在HEAP表上使用ORDER BY?

如果不是用键码第一部分
SELECT * FROM table_name WHERE key_part2=1

如果使用以一个通配W开始的LIKE
SELECT * FROM table_name WHERE key_part1 LIKE '%jani%'

搜烦一个烦引而在另一个烦引上做ORDER BY
SELECT * from table_name WHERE key_part1 = # ORDER BY key2

--------------------------------------------------------------------------------

二十四、学会用EXPLAIN

对于每一条你认ؓ太慢的查询用EXPLAIN!

mysql> explain select t3.DateOfAction, t1.TransactionID
-> from t1 join t2 join t3
-> where t2.ID = t1.TransactionID and t3.ID = t2.GroupID
-> order by t3.DateOfAction, t1.TransactionID;
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
| t1 | ALL | NULL | NULL | NULL | NULL | 11 | Using temporary; Using filesort |
| t2 | ref | ID | ID | 4 | t1.TransactionID | 13 | |
| t3 | eq_ref | PRIMARY | PRIMARY | 4 | t2.GroupID | 1 | |
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+

ALL和范围类型提CZ个潜在的问题?

--------------------------------------------------------------------------------

二十五、学会用SHOW PROCESSLIST

使用SHOW processlist来发现正在做什么:
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+
| 6 | monty | localhost | bp | Query | 15 | Sending data | select * from station,station as s1 |
| 8 | monty | localhost | | Query | 0 | | show processlist |
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+

在mysql或mysqladmin中用KILL来杀L掉的U程?br /> --------------------------------------------------------------------------------

二十六、如何知晓MySQL解决一条查?

q行列命oq试囑ּ明白其输出:
SHOW VARIABLES;
SHOW COLUMNS FROM ...\G
EXPLAIN SELECT ...\G
FLUSH STATUS;
SELECT ...;
SHOW STATUS;

--------------------------------------------------------------------------------

二十七、MySQL非常不错

日志
在进行很多连接时Q连接非常快?br /> 同时使用SELECT和INSERT的场合?br /> 在不把更C耗时太长的选择l合时?br /> 在大多数选择/更新使用唯一键码时?br /> 在用没有长旉冲突锁定的多个表时?br /> 在用大表?MySQL使用一个非常紧凑的表格??

--------------------------------------------------------------------------------

二十八、MySQL应避免的事情

用删掉的行更新或插入表,l合要耗时长的SELECT?br /> 在能攑֜WHERE子句中的列上用HAVING?br /> 不用键码或键码不够唯一而进行JOIN?br /> 在不同列cd的列上JOIN?br /> 在不使用=匚w整个键码时用HEAP表?br /> 在MySQL监控E序中忘记在UPDATE或DELETE中用一条WHERE子句。如果想q样做,使用mysql客户E序?-i-am-a-dummy选项?

--------------------------------------------------------------------------------

二十九、MySQL各种锁定

内部表锁?br /> LOCK TABLESQ所有表cd适用Q?br /> GET LOCK()/RELEASE LOCK()
面锁定Q对BDB表)
ALTER TABLE也在BDB表上q行表锁?br /> LOCK TABLES允许一个表有多个读者和一个写者?br /> 一般WHERE锁定h比READ锁定高的优先U以避免让写入方q等。对于不重要的写入方Q可以用LOW_PRIORITY关键字让锁定处理器优选读取方?br /> UPDATE LOW_PRIORITY SET value=10 WHERE id=10;

--------------------------------------------------------------------------------

三十、给MySQL更多信息以更好地解决问题的技?

注意你总能L(加注?MySQL功能以查询可移植:

SELECT /*! SQL_BUFFER_RESULTS */ ...
SELECT SQL_BUFFER_RESULTS ...
强制MySQL生成一个时结果集。只要所有时结果集生成后,所有表上的锁定均被释放。这能在遇到表锁定问题时或要花很长时间将l果传给客户端时有所帮助?br /> SELECT SQL_SMALL_RESULT ... GROUP BY ...
告诉优化器结果集只包含很少的行?br /> SELECT SQL_BIG_RESULT ... GROUP BY ...
告诉优化器结果集包含很多行?br /> SELECT STRAIGHT_JOIN ...
强制优化器以出现在FROM子句中的ơ序联结表?br /> SELECT ... FROM table_name [USE INDEX (index_list) | IGNORE INDEX (index_list)] table_name2
强制MySQL使用/忽略列出的烦引?

--------------------------------------------------------------------------------

三十一、事务的例子

MyIASM表如何进行事务处?
mysql> LOCK TABLES trans READ, customer WRITE;
mysql> select sum(value) from trans where customer_id=some_id;
mysql> update customer set total_value=sum_from_previous_statement
where customer_id=some_id;
mysql> UNLOCK TABLES;

BDB表如何进行事?
mysql> BEGIN WORK;
mysql> select sum(value) from trans where customer_id=some_id;
mysql> update customer set total_value=sum_from_previous_statement
where customer_id=some_id;
mysql> COMMIT;

注意你可以通过下列语句回避事务:
UPDATE customer SET value=value+new_value WHERE customer_id=some_id;

--------------------------------------------------------------------------------

三十二、用REPLACE的例?

REPLACE的功能极像INSERTQ除了如果一条老记录在一个唯一索引上具有与新纪录相同的|那么老记录在新纪录插入前则被删除。不使用

SELECT 1 FROM t1 WHERE key=#
IF found-row
LOCK TABLES t1
DELETE FROM t1 WHERE key1=#
INSERT INTO t1 VALUES (...)
UNLOCK TABLES t1;
ENDIF

而用
REPLACE INTO t1 VALUES (...)

--------------------------------------------------------------------------------

三十三、一般技?

使用短主键。联l表时用数字而非字符丌Ӏ?br /> 当用多部分键码ӞW一部分应该时最常用的部分?br /> 有疑问时Q首先用更多重复的列以获得更好地键码压~?br /> 如果在同一台机器上q行MySQL客户和服务器Q那么在q接MySQL时则使用套接字而不是TCP/IPQ这可以提高性能7.5%Q。可在连接MySQL服务器时不指定主机名或主机名为localhost来做到?br /> 如果可能Q?-skip-locking(在某些OS上ؓ默认)Q这关闭外部锁定ƈ提高性能?br /> 使用应用层哈希D非镉K码:
SELECT * FROM table_name WHERE hash=MD5(concat(col1,col2)) AND
col_1='constant' AND col_2='constant'

在文件中保存需要以文g形式讉K的BLOBQ在数据库中只保存文件名?br /> 删除所有行比删除一大部分行要快?br /> 如果SQL不够快,研究一下访问数据的较底层接口?

--------------------------------------------------------------------------------

三十四、用MySQL 3.23的好?

MyISAMQ可UL的大表格?br /> HEAPQ内存中的表
Berkeley DBQ支持事务的表?br /> 众多提高的限?br /> 动态字W集
更多的STATUS变量
CHECK和REPAIR?br /> 更快的GROUP BY和DISTINCT
LEFT JOIN ... IF NULL的优?br /> CREATE TABLE ... SELECT
CREATE TEMPORARY table_name (...)
临时HEAP表到MyISAM表的自动转换
复制
mysqlhotcopy脚本

--------------------------------------------------------------------------------

三十五、正在积极开发的重要功能

改进事务处理
p|安全的复?br /> 正文搜烦
多个表的删除(之后完成多个表的更新)
更好的键码缓?br /> 原子RENAME (RENAME TABLE foo as foo_old, foo_new as foo)
查询高速缓?br /> MERGE TABLES
一个更好的GUI客户E序

MySQL优化明指?

--------------------------------------------------------------------------------

2004-05-25

一、在~译时优化MySQL
如果你从源代码分发安装MySQLQ要注意Q编译过E对以后的目标程序性能有重要的影响Q不同的~译方式可能得到cM的目标文Ӟ但性能可能相差很大Q因 此,在编译安装MySQL适应仔细Ҏ你的应用cd选择最可能好的~译选项。这U定制的MySQL可以Z的应用提供最x能?

技巧:选用较好的编译器和较好的~译器选项Q这样应用可提高性能10-30%。(MySQL文档如是_

1.1、用pgccQPentium GCC)~译?br /> 该编译器Q?a >http://www.goof.com/pcg/Q针对运?...l谙低成杓频?

1.2、仅使用你想使用的字W集~译MySQL
MySQL目前提供多达24U不同的字符集,为全球用户以他们自己的语a插入或查看表中的数据。却省情况下QMySQL安装所有者这些字W集Q热然而,最好的选择是指选择一U你需要的。如Q禁止除Latin1字符集以外的所有其它字W集Q?

--------------------------------------------------------------------------------
%>./configure -with-extra-charsets=none [--other-configuration-options]
--------------------------------------------------------------------------------

1.3、将mysqld~译成静态执行文?br /> mysqld~译成静态执行文件而无需׃n库也能获得更好的性能。通过在配|时指定下列选项Q可静态编译mysqld?

--------------------------------------------------------------------------------
%>./configure -with-mysqld-ldflags=-all-static [--other-configuration-options]
--------------------------------------------------------------------------------

1.4、配|样?br /> 下列配置命o常用于提高性能Q?

--------------------------------------------------------------------------------
%>CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared
--------------------------------------------------------------------------------

二、调整服务器
保q用正确的编译固焉要,但这只是成功的第一步,配置众多的MySQL变量同样Ҏ务器的正常运行v关键作用。你可以这些变量的赋值存在一个配|文件中Q以保它们在每ơ启动MySQL时均起作用,q个配置文g是my.cnf文g?

MySQL已经提供了几个my.cnf文g的样本,可在/usr/local/mysqld/share/mysql/目录下找到。这些文件分别命 名ؓ my-small.cnf? my-medium.cnf、my-large.cnf和my-huge.cnfQ规模说明可在描q配|文仉用的系l类型标题中扑ֈ。如果在只有相当? 内存的系l上q行MySQLQ而且只是偶尔的用一下,那么my-small.cnf会比较理惻I因ؓ它命令mysqld只用最的资源。类似地Q如果你 计划构徏电子商务市Q而且pȝ拥有2G内存Q那么你可能要用到mysql-huge.cnf文g了?

Z利用q些文g中的一个,你需要复制一个最适合需求的文gQ改名ؓmy.cnf。你可以选择使用配置文g三种作用范围的一U:

GlobalQ将my.cnf文g复制到服务器?etc目录下,q得配|文件中的变量作用于全局Q即Ҏ有服务器上的MySQL数据库服务器有效?br /> LocalQ将my.cnf文g复制到[MYSQL-INSTALL-DIR]/var/目录下,使得my.cnf作用于特定的服务器。[MYSQL-INSTALL-DIR]表示MySQL安装目录?br /> UserQ你可以再限制作用于特定的用Pmy.cnf复制到用L根目录下?br /> I竟如何讄my.cnf中的q些变量呢?更进一步说Q你可以讄哪一个变量。虽然所用变量对MySQL服务器相寚w用Q每一个变量与MySQL的的某些lg有更特定的关pR如变量max_connects归在mysqldcd下。执行下列命令即可知道:

--------------------------------------------------------------------------------
%>/usr/local/mysql/libexec/mysqld --help
--------------------------------------------------------------------------------

它显C大量的选项及与mysqld相关的变量。你可以很容易地在该行文字之下找出变量:

--------------------------------------------------------------------------------
Possible variables for option --set-variable (-O) are
--------------------------------------------------------------------------------

然后你可以如下设|my.cnf中的那些变量Q?

--------------------------------------------------------------------------------
set-variable = max_connections=100
--------------------------------------------------------------------------------

它设|MySQL服务器的最大ƈ发连接数?00。要保在my.cnf文g中的[mysqld]标题下插入变量设|?br /> 三、表cd

很多MySQL用户可能很惊ӞMySQL实为用h?U不同的表类型,UCؓDBD、HEAP、ISAM、MERGE和MyIASM。DBD归ؓ事务安全c,而其他ؓ非事务安全类?

3.1、事务安?

DBD
Berkeley DB(DBD)表是支持事务处理的表Q由Sleepycat软g公司(http://www.sleepycat.com)开发。它提供MySQL用户期待已久的功?事务控制。事务控制在M数据库系l中都是一个极有h值的功能Q因为它们确保一l命令能成功地执行?/a>

3.2、非事务安全

HEAP

HEAP表是MySQL中存取数据最快的表。这是因Z们用存储在动态内存中的一个哈希烦引。另一个要Ҏ如果MySQL或服务器崩溃Q数据将丢失?

ISAM

ISAM表是早期MySQL版本的缺省表cdQ直到MyIASM开发出来。徏议不要再使用它?

MERGE

MERGE是一个有的新类型,?.23.25之后出现。一个MERGE表实际上是一个相同MyISAM表的集合Q合q成一个表Q主要是Z效率原因。这样可以提高速度、搜索效率、修复效率ƈ节省盘I间?

MyIASM

q是MySQL的缺省表cd。它ZIASM代码Q但有很多有用的扩展。MyIASM比较好的原因Q?

MyIASM表小于IASM表,所以用较资源?br /> MyIASM表在不同的^C二进制层可移植?br /> 更大的键码尺寸,更大的键码上限?br /> 3.3、指定表cd

你可在创时指定表的类型。下例创Z个HEAP表:

--------------------------------------------------------------------------------

mysql>CREATE TABLE email_addresses TYPE=HEAP (
->email char(55) NOT NULL,
->name char(30) NOT NULL,
->PRIMARY KEY(email) );

--------------------------------------------------------------------------------

BDB表需要一些配|工作,参见http://www.mysql.com/doc/B/D/BDB_overview.html?

3.4、更多的表类?

Z使MySQL理工作更有,卛_发布的MySQL 4.0提供两U新的表cdQ称为Innobase和Gemeni?

4、优化工?

MySQL服务器本w提供了几条内置命o用于帮助优化?

4.1、SHOW

你可能有兴趣知道MySQL服务器究竟更了什么,下列命ol出一个ȝQ?

--------------------------------------------------------------------------------
mysql>show status;
--------------------------------------------------------------------------------

它给Z一个相当长的状态变量及其值的列表。有些变量包含了异常l止客户的数量、异常终止连接的数量、连接尝试的ơ数、最大ƈ发连接数和大量其他有用的信息。这些信息对扑ևpȝ问题和低效极具h倹{?br /> SHOWq能做更多的事情。它可以昄关于日志文g、特定数据库、表、烦引、进E和权限表中有h值的信息。详见MySQL手册?

4.2、EXPLAIN

当你面对SELECT语句ӞEXPLAIN解释SELECT命o如何被处理。这不仅对决定是否应该增加一个烦引,而且对决定一个复杂的Join如何被MySQL处理都是有帮助的?

4.3、OPTIMIZE

OPTIMIZE语句允许你恢复空间和合ƈ数据文g片Q对包含变长行的表进行了大量更新和删除后Q这样做特别重要。OPTIMIZE目前只工作于MyIASM和BDB表?/p>

pony 2008-04-19 00:37 发表评论
]]>
(?Java中的字符集编?/title><link>http://www.tkk7.com/jjwwhmm/articles/188758.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Wed, 26 Mar 2008 07:11:00 GMT</pubDate><guid>http://www.tkk7.com/jjwwhmm/articles/188758.html</guid><wfw:comment>http://www.tkk7.com/jjwwhmm/comments/188758.html</wfw:comment><comments>http://www.tkk7.com/jjwwhmm/articles/188758.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/jjwwhmm/comments/commentRss/188758.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jjwwhmm/services/trackbacks/188758.html</trackback:ping><description><![CDATA[转蝲?<span style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; ">http://china.manufacturer.com/article/study_for_character_encoding_java.htm</span> <div><font face="'Lucida Grande'" size="3"><span style="font-size: 12px; white-space: pre;">q是我看到的最全的介绍字符集编码的文章,其是关?span style="font-family: 'Times New Roman'; font-size: 16px; white-space: normal; ">setCharacterEncoding()q个Ҏ的解释以及GET方式与POST方式的区?以前实是没注意到这一?<span style="font-family: 'Lucida Grande'; font-size: 12px; white-space: pre; ">谢谢作?</span></span></span></font></div> <div> <div><font face="'Lucida Grande'" size="3"><span style="font-size: 12px; white-space: pre;"><span style="font-family: 'Times New Roman'; font-size: 16px; white-space: normal; "> <p class="1">1. 概述</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">本文主要包括以下几个斚wQ编码基本知识,javaQ系lYӞurlQ工兯Y件等?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">在下面的描述中,以"中文"两个字ؓ例,l查表可以知道其GB2312~码?<u>d6d0 cec4</u>"QUnicode~码?<u>4e2d 6587</u>"QUTF~码是"<u>e4b8ad e69687</u>"。注意,q两个字没有iso8859-1~码Q但可以用iso8859-1~码?表示"?/p> <p class="1">2. ~码基本知识</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">最早的~码是iso8859-1Q和ascii~码怼。但Z方便表示各种各样的语aQ逐渐出现了很多标准编码,重要的有如下几个?/p> <p class="2">2.1. iso8859-1</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">属于单字节编码,最多能表示的字W范围是0-255Q应用于英文pd。比如,字母'a'的编码ؓ0x61=97?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">很明显,iso8859-1~码表示的字W范围很H,无法表示中文字符。但是,׃是单字节~码Q和计算机最基础的表C单位一_所以很多时候,仍旧使用iso8859-1~码来表C。而且在很多协议上Q默认用该~码。比如,虽然"中文"两个字不存在iso8859-1~码Q以gb2312~码ZQ应该是"<u>d6d0 cec4</u>"两个字符Q用iso8859-1~码的时候则它拆开?个字节来表示Q?<u>d6 d0 ce c4</u>"Q事实上Q在q行存储的时候,也是以字节ؓ单位处理的)。而如果是UTF~码Q则?个字?<u>e4 b8 ad e6 96 87</u>"。很明显Q这U表C方法还需要以另一U编码ؓ基础?/p> <p class="2">2.2. GB2312/GBK</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">q就是汉子的国标码,专门用来表示汉字Q是双字节编码,而英文字母和iso8859-1一_兼容iso8859-1~码Q。其中gbk~码能够用来同时表示J体字和体字Q而gb2312只能表示体字Qgbk是兼容gb2312~码的?/p> <p class="2">2.3. unicode</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">q是最l一的编码,可以用来表示所有语a的字W,而且是定长双字节Q也有四字节的)~码Q包括英文字母在内。所以可以说它是不兼容iso8859-1~码的,也不兼容M~码。不q,相对于iso8859-1~码来说Quniocode~码只是在前面增加了一?字节Q比如字?a'?<u>00 61</u>"?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">需要说明的是,定长~码便于计算机处理(注意GB2312/GBK不是定长~码Q,而unicode又可以用来表C所有字W,所以在很多软g内部是用unicode~码来处理的Q比如java?/p> <p class="2">2.4. UTF</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">考虑到unicode~码不兼容iso8859-1~码Q而且Ҏ占用更多的空_因ؓ对于英文字母Qunicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而生了utf~码Qutf~码兼容iso8859-1~码Q同时也可以用来表示所有语a的字W,不过Qutf~码是不定长~码Q每一个字W的长度?-6个字节不{。另外,utf~码自带单的校验功能。一般来Ԍ英文字母都是用一个字节表C,而汉字用三个字节?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">注意Q虽然说utf是ؓ了用更的I间而用的Q但那只是相对于unicode~码来说Q如果已l知道是汉字Q则使用GB2312/GBK无疑是最节省的。不q另一斚wQ值得说明的是Q虽然utf~码Ҏ字?个字节,但即使对于汉字网,utf~码也会比unicode~码节省Q因为网中包含了很多的英文字符?/p> <p class="1">3. java对字W的处理</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">在java应用软g中,会有多处涉及到字W集~码Q有些地斚w要进行正的讄Q有些地斚w要进行一定程度的处理?/p> <p class="2">3.1. getBytes(charset)</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">q是java字符串处理的一个标准函敎ͼ其作用是字W串所表示的字W按照charset~码Qƈ以字节方式表C。注意字W串在java内存中L按unicode~码存储的。比?中文"Q正常情况下Q即没有错误的时候)存储?<u>4e2d 6587</u>"Q如果charset?gbk"Q则被编码ؓ"<u>d6d0 cec4</u>"Q然后返回字?<u>d6 d0 ce c4</u>"。如果charset?utf8"则最后是"<u>e4 b8 ad e6 96 87</u>"。如果是"iso8859-1"Q则׃无法~码Q最后返?"<u>3f 3f</u>"Q两个问P?/p> <p class="2">3.2. new String(charset)</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">q是java字符串处理的另一个标准函敎ͼ和上一个函数的作用相反Q将字节数组按照charset~码q行l合识别Q最后{换ؓunicode存储。参考上qgetBytes的例子,"gbk" ?utf8"都可以得出正的l果"<u>4e2d 6587</u>"Q但iso8859-1最后变成了"<u>003f 003f</u>"Q两个问P?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">因ؓutf8可以用来表示/~码所有字W,所以new String( str.getBytes( "utf8" ), "utf8" ) === strQ即完全可逆?/p> <p class="2">3.3. setCharacterEncoding()</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">该函数用来设|httph或者相应的~码?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">对于requestQ是指提交内容的~码Q指定后可以通过getParameter()则直接获得正的字符Ԍ如果不指定,则默认用iso8859-1~码Q需要进一步处理。参见下q?表单输入"。值得注意的是在执行setCharacterEncoding()之前Q不能执行Q何getParameter()。java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。而且Q该指定只对POSTҎ有效Q对GETҎ无效。分析原因,应该是在执行W一个getParameter()的时候,java会按照~码分析所有的提交内容Q而后l的getParameter()不再q行分析Q所以setCharacterEncoding()无效。而对于GETҎ提交表单是,提交的内容在URL中,一开始就已经按照~码分析所有的提交内容QsetCharacterEncoding()自然无效?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">对于responseQ则是指定输出内容的~码Q同Ӟ该设|会传递给览器,告诉览器输出内Ҏ采用的编码?/p> <p class="2">3.4. 处理q程</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">下面分析两个有代表性的例子Q说明java对编码有关问题的处理Ҏ?/p> <p class="3">3.4.1. 表单输入</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">User input<u>  *(gbk:d6d0 cec4)  </u>browser<u>  *(gbk:d6d0 cec4)  </u>web server<u>  iso8859-1(00d6 00d 000ce 00c4)  </u>classQ需要在class中进行处理:getbytes("iso8859-1")?u>d6 d0 ce c4</u>Qnew String("gbk")?u>d6d0 cec4</u>Q内存中以unicode~码则ؓ<u>4e2d 6587</u>?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings; ">l</span> 用户输入的编码方式和面指定的编码有养I也和用户的操作系l有养I所以是不确定的Q上例以gbkZ?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings; ">l</span> 从browser到web serverQ可以在表单中指定提交内Ҏ使用的字W集Q否则会使用面指定的编码。而如果在url中直接用?的方式输入参敎ͼ则其~码往往是操作系l本w的~码Q因时和面无关。上qC旧以gbk~码Z?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings; ">l</span> Web server接收到的是字节流Q默认时QgetParameterQ会以iso8859-1~码处理之,l果是不正确的,所以需要进行处理。但如果预先讄了编码(通过request. setCharacterEncoding ()Q,则能够直接获取到正确的结果?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings; ">l</span> 在页面中指定~码是个好习惯,否则可能失去控制Q无法指定正的~码?/p> <p class="3">3.4.2. 文g~译</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">假设文g是gbk~码保存的,而编译有两种~码选择Qgbk或者iso8859-1Q前者是中文windows的默认编码,后者是linux的默认编码,当然也可以在~译时指定编码?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">Jsp<u>  *(gbk:d6d0 cec4)  </u>java file<u>  *(gbk:d6d0 cec4)  </u>compiler read<u>  uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)  </u>compiler write<u>  utf(gbk: e4b8ad e69687; iso8859-1: *)  </u>compiled file<u>  unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)  </u>class。所以用gbk~码保存Q而用iso8859-1~译的结果是不正的?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">class<u>  unicode(4e2d 6587)  </u>system.out / jsp.out<u>  gbk(d6d0 cec4)  </u>os console / browser?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings; ">l</span> 文g可以以多U编码方式保存,中文windows下,默认为ansi/gbk?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings; ">l</span> ~译器读取文件时Q需要得到文件的~码Q如果未指定Q则使用pȝ默认~码。一般class文gQ是以系l默认编码保存的Q所以编译不会出问题Q但对于jsp文gQ如果在中文windows下编辑保存,而部|在英文linux下运?~译Q则会出现问题。所以需要在jsp文g中用pageEncoding指定~码?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings; ">l</span> Java~译的时候会转换成统一的unicode~码处理Q最后保存的时候再转换为utf~码?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings; ">l</span> 当系l输出字W的时候,会按指定~码输出Q对于中文windows下,System.out用gbk~码Q而对于responseQ浏览器Q,则用jsp文g头指定的contentTypeQ或者可以直接ؓresponse指定~码。同Ӟ会告诉browser|页的编码。如果未指定Q则会用iso8859-1~码。对于中文,应该为browser指定输出字符串的~码?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings; ">l</span> browser昄|页的时候,首先使用response中指定的~码Qjsp文g头指定的contentType最l也反映在response上)Q如果未指定Q则会用网中metaҎ定中的contentType?/p> <p class="2">3.5. 几处讄</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">对于web应用E序Q和~码有关的设|或者函数如下?/p> <p class="3">3.5.1. jsp~译</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">指定文g的存储编码,很明显,该设|应该置于文件的开头。例如:<%@page pageEncoding="GBK"%>。另外,对于一般class文gQ可以在~译的时候指定编码?/p> <p class="3">3.5.2. jsp输出</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">指定文g输出到browser是用的~码Q该讄也应该置于文件的开头。例如:<%@ page contentType="text/html; charset= GBK" %>。该讄和response.setCharacterEncoding("GBK"){效?/p> <p class="3">3.5.3. meta讄</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">指定|页使用的编码,该设|对静态网尤其有作用。因为静态网|法采用jsp的设|,而且也无法执行response.setCharacterEncoding()。例如:<<st1:place w:st="on">META http-equiv="Content-Type" content="text/html; charset=GBK" /></st1:place></p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">如果同时采用了jsp输出和meta讄两种~码指定方式Q则jsp指定的优先。因为jsp指定的直接体现在response中?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">需要注意的是,apache有一个设|可以给无编码指定的|页指定~码Q该指定{同于jsp的编码指定方式,所以会覆盖静态网中的meta指定。所以有人徏议关闭该讄?/p> <p class="3">3.5.4. form讄</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">当浏览器提交表单的时候,可以指定相应的编码。例如:<form accept-charset= "gb2312">。一般不必不使用该设|,览器会直接使用|页的编码?/p> <p class="1">4. pȝ软g</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">下面讨论几个相关的系lY件?/p> <p class="2">4.1. mysql数据?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">很明显,要支持多语言Q应该将数据库的~码讄成utf或者unicodeQ而utf更适合与存储。但是,如果中文数据中包含的英文字母很少Q其实unicode更ؓ适合?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">数据库的~码可以通过mysql的配|文件设|,例如default-character-set=utf8。还可以在数据库链接URL中设|,例如Q?useUnicode=true&characterEncoding=UTF-8。注意这两者应该保持一_在新的sql版本里,在数据库链接URL里可以不q行讄Q但也不能是错误的设|?/p> <p class="2">4.2. apache</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">appache和编码有关的配置在httpd.conf中,例如AddDefaultCharset UTF-8。如前所qͼ该功能会所有静态页面的~码讄为UTF-8Q最好关闭该功能?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">另外Qapacheq有单独的模块来处理|页响应_其中也可能对~码q行讄?/p> <p class="2">4.3. linux默认~码</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">q里所说的linux默认~码Q是指运行时的环境变量。两个重要的环境变量是LC_ALL和LANGQ默认编码会影响到java URLEncode的行为,下面有描q?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">都设|ؓ"zh_CN.UTF-8"?/p> <p class="2">4.4. 其它</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">Z支持中文文g名,linux在加载磁盘时应该指定字符集,例如Qmount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">另外Q如前所qͼ使用GETҎ提交的信息不支持request.setCharacterEncoding()Q但可以通过tomcat的配|文件指定字W集Q在tomcat的server.xml文g中,形如Q?lt;Connector ... URIEncoding="GBK"/>。这U方法将l一讄所有请求,而不能针对具体页面进行设|,也不一定和browser使用的编码相同,所以有时候ƈ不是所期望的?/p> <p class="1">5. URL地址</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">URL地址中含有中文字W是很麻烦的Q前面描q过使用GETҎ提交表单的情况,使用GETҎӞ参数是包含在URL中?/p> <p class="2">5.1. URL~码</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">对于URL中的一些特D字W,览器会自动q行~码。这些字W除?/?&"{外Q还包括unicode字符Q比如汉子。这时的~码比较Ҏ?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">IE有一个选项"L使用UTF-8发送URL"Q当该选项有效ӞIE会对特D字W进行UTF-8~码Q同时进行URL~码。如果改选项无效Q则使用默认~码"GBK"Qƈ且不q行URL~码。但是,对于URL后面的参敎ͼ则L不进行编码,相当于UTF-8选项无效。比?中文.html?a=中文"Q当UTF-8选项有效Ӟ发送链?%<u>e4%b8%ad%e6%96%87.html?a=\x4e\x2d\x65\x87</u>"Q而UTF-8选项无效Ӟ发送链?<u>\x4e\x2d\x65\x87.html?a=\x4e\x2d\x65\x87</u>"。注意后者前面的"中文"两个字只?个字节,而前者却?8个字节,q主要时URL~码的原因?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">当web serverQtomcatQ接收到该链接时Q将会进行URL解码Q即L"%"Q同时按照ISO8859-1~码Q上面已l描qͼ可以使用URLEncoding来设|成其它~码Q识别。上qC子的l果分别?<u>\ue4\ub8\uad\ue6\u96\u87.html?a=\u4e\u2d\u65\u87</u>"?<u>\u4e\u2d\u65\u87.html?a=\u4e\u2d\u65\u87</u>"Q注意前者前面的"中文"两个字恢复成?个字W。这里用"\u"Q表C是unicode?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">所以,׃客户端设|的不同Q相同的链接Q在服务器上得到了不同结果。这个问题不h都遇刎ͼ却没有很好的解决办法。所以有的网站会用户试关闭UTF-8选项。不q,下面会描qC个更好的处理办法?/p> <p class="2">5.2. rewrite</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">熟悉的h都知道,apache有一个功能强大的rewrite模块Q这里不描述其功能。需要说明的是该模块会自动将URL解码Q去?Q,卛_成上qweb serverQtomcatQ的部分功能。有相关文档介绍说可以用[NE]参数来关闭该功能Q但我试验ƈ未成功,可能是因为版本(我用的是apache <st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">2.0.54Q问题。另外,当参C含有"?& "{符L时候,该功能将Dpȝ得不到正常结果?/st1:chsdate></p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">rewrite本ng完全是采用字节处理的方式Q而不考虑字符串的~码Q所以不会带来编码问题?/p> <p class="2">5.3. URLEncode.encode()</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">q是Java本n提供对的URL~码函数Q完成的工作和上qUTF-8选项有效时浏览器所做的工作怼。值得说明的是Qjava已经不赞成不指定~码来用该ҎQdeprecatedQ。应该在使用的时候增加编码指定?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">当不指定~码的时候,该方法用系l默认编码,q会D软gq行l果得不定。比如对?中文"Q当pȝ默认~码?gb2312"Ӟl果?%<u>4e%2d%65%87</u>"Q而默认编码ؓ"UTF-8"Q结果却?%<u>e4%b8%ad%e6%96%87</u>"Q后l程序将难以处理。另外,q儿说的pȝ默认~码是由q行tomcat时的环境变量LC_ALL和LANG{决定的Q曾l出现过tomcat重启后就出现q的问题,最后才郁闷的发现是因ؓ修改修改了这两个环境变量?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">l一指定?UTF-8"~码Q可能需要修改相应的E序?/p> <p class="2">5.4. 一个解x?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">上面说vq,因ؓ览器设|的不同Q对于同一个链接,web server收到的是不同内容Q而Y件系l有无法知道q中间的区别Q所以这一协议目前q存在缺陗?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">针对具体问题Q不应该侥幸认ؓ所有客LIE讄都是UTF-8有效的,也不应该_暴的徏议用户修改IE讄Q要知道Q用户不可能去记住每一个web server的设|。所以,接下来的解决办法只能是让自qE序多一Ҏ能:Ҏ内容来分析编码是否UTF-8?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">比较q运的是UTF-8~码相当有规律,所以可以通过分析传输q来的链接内容,来判断是否是正确的UTF-8字符Q如果是Q则以UTF-8处理之,如果不是Q则使用客户默认~码Q比?GBK"Q,下面是一个判断是否UTF-8的例子,如果你了解相应规律,容易理解?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">public static boolean isValidUtf8(byte[] b,int aMaxCount){</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">       int lLen=b.length,lCharCount=0;</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">       for(int i=0;i<lLen && lCharCount<aMaxCount;++lCharCount){</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">              byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">              if(lByte>=0) continue;//>=0 is normal ascii</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">              if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false;</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">              int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">                     :lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">              if(i+lCount>lLen) return false;</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">              for(int j=0;j<lCount;++j,++i) if(b[i]>=(byte)0xc0) return false;</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">       }</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">       return true;</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">}</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">相应圎ͼ一个用上q方法的例子如下Q?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">public static String getUrlParam(String aStr,String aDefaultCharset)</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">throws UnsupportedEncodingException{</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">       if(aStr==null) return null;</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">       byte[] lBytes=aStr.getBytes("ISO-8859-1");</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">       return new String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset);</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">}</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">不过Q该Ҏ也存在缺P如下两方面:</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-family: Wingdings; ">l</span> 没有包括对用户默认编码的识别Q这可以Ҏh信息的语a来判断,但不一定正,因ؓ我们有时候也会输入一些韩文,或者其他文字?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><span lang="EN-US" style="font-family: Wingdings; ">l</span> 可能会错误判断UTF-8字符Q一个例子是"学习"两个字,其GBK~码? <u>\xd1\xa7\xcf\xb0</u>"Q如果用上qisValidUtf8Ҏ判断Q将q回true。可以考虑使用更严格的判断ҎQ不q估计效果不大?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">有一个例子可以证明google也遇C上述问题Q而且也采用了和上q相似的处理ҎQ比如,如果在地址栏中输入"<a Qgoogle无法正识别,而其他汉字一般能够正常识别?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">最后,应该补充说明一下,如果不用rewrite规则Q或者通过表单提交数据Q其实ƈ不一定会遇到上述问题Q因时可以在提交数据时指定希望的~码。另外,中文文g名确实会带来问题Q应该}慎用?/p> <p class="1">6. 其它</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">下面描述一些和~码有关的其他问题?/p> <p class="2">6.1. SecureCRT</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">除了览器和控制C~码有关外,一些客L也很有关pR比如在使用SecureCRTq接linuxӞ应该让SecureCRT的显C编码(不同的sessionQ可以有不同的编码设|)和linux的编码环境变量保持一致。否则看到的一些帮助信息,可能是q?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">另外Qmysql有自q~码讄Q也应该保持和SecureCRT的显C编码一致。否则通过SecureCRT执行sql语句的时候,可能无法处理中文字符Q查询结果也会出Cؕ码?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">对于Utf-8文gQ很多编辑器Q比如记事本Q会在文件开头增加三个不可见的标志字节,如果作ؓmysql的输入文Ӟ则必要Lq三个字W。(用linux的vi保存可以Lq三个字W)。一个有的现象是,在中文windows下,创徏一个新txt文gQ用C本打开Q输?q?两个字,保存Q再打开Q你会发C个字没了Q只留下一个小黑点?/p> <p class="2">6.2. qo?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">如果需要统一讄~码Q则通过filterq行讄是个不错的选择。在filter class中,可以l一为需要的h或者回应设|编码。参加上qsetCharacterEncoding()。这个类apache已经l出了可以直接用的例子SetCharacterEncodingFilter?/p> <p class="2">6.3. POST和GET</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">很明显,以POST提交信息ӞURL有更好的可读性,而且可以方便的用setCharacterEncoding()来处理字W集问题。但GETҎ形成的URL能够更容易表辄늚实际内容Q也能够用于收藏?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">从统一的角度考虑问题Q徏议采用GETҎQ这要求在程序中获得参数是进行特D处理,而无法用setCharacterEncoding()的便利,如果不考虑rewriteQ就不存在IE的UTF-8问题Q可以考虑通过讄URIEncoding来方便获取URL中的参数?/p> <p class="2">6.4. J体~码转换</p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">GBK同时包含体和J体~码Q也是说同一个字Q由于编码不同,在GBK~码下属于两个字。有时候,Z正确取得完整的结果,应该繁体和体进行统一。可以考虑UTF、GBK中的所有繁体字Q{换ؓ相应的简体字QBIG5~码的数据,也应该{化成相应的简体字。当Ӟ仍旧以UTF~码存储?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; ">例如Q对?语言 語言"Q用UTF表示?<u>\x</u><u>E8\xAF\xAD\xE8\xA8\x80 \xE8\xAA\x9E\xE8\xA8\x80</u>"Q进行简J体~码转换后应该是两个相同?"<u>\x</u><u>E8\xAF\xAD\xE8\xA8\x80></u>"?/p> <p class="MsoBodyTextIndent" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "> </p> <p class="MsoBodyTextIndent" align="right" style="word-break: break-all; margin-top: 0cm; margin-right: 0cm; margin-bottom: 6pt; margin-left: 0cm; text-align: justify; text-indent: 10pt; font-size: 10.5pt; font-family: 'Times New Roman'; "><a >Manufacturer.com</a> 刘科?/p> </span></span></font></div> </div> <img src ="http://www.tkk7.com/jjwwhmm/aggbug/188758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jjwwhmm/" target="_blank">pony</a> 2008-03-26 15:11 <a href="http://www.tkk7.com/jjwwhmm/articles/188758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]使用复制来提升MySQL的高可用性和处理能力http://www.tkk7.com/jjwwhmm/articles/187771.htmlponyponyFri, 21 Mar 2008 11:03:00 GMThttp://www.tkk7.com/jjwwhmm/articles/187771.htmlhttp://www.tkk7.com/jjwwhmm/comments/187771.htmlhttp://www.tkk7.com/jjwwhmm/articles/187771.html#Feedback0http://www.tkk7.com/jjwwhmm/comments/commentRss/187771.htmlhttp://www.tkk7.com/jjwwhmm/services/trackbacks/187771.html

lhwork 发表?2007-1-19 9:30:08

昨晚看了一晚上的MySQL文档Q主要是关于MySQL的复制方面的文档Q用的工hMySQL的帮助文?金山词霸?/p>

l于比较大概的了解了如何通过复制来提升MySQL数据库的高可用性和处理能力Q不q还没有l过实际的试验,但整体的思想是清楚了Q下面把思\大概的描qC下,有机会再q行实验?/p>

首先在服务器端采?+N的模型来安装和配|MySQL数据库?是一个master数据库,N是一臛_个slave数据库。master数据库必d用binlog模式Q关于这两种数据库的配置参见MySQL的文档。配|完成后Ş成了一?+N的复刉,当对masterq行修改时会自动把修改的数据更新到N个slave数据库上。但是有一个注意的是,所有的修改操作包括d、删除、修改等语句必须作用在master数据库上Q这h能数据可靠的复制到其他slave服务器上。另外,׃slave服务器只用作查询Q因此选用MyISAM的存储引擎可以提高查询的速度?/p>

而在客户端呢Q如何客户端程序能均衡的用这些可用的服务器呢Q而且更新操作只能对masterq行处理。这个岂不是应用E序Ҏ据库的操作逻辑非常的复杂?

其实没有那么复杂QMySQL为我们提供了接口可以这些复杂的操作透明化。下面主要介l采用JDBC的客L如何工作在基于复制的集群环境中,其他~程语言请参照mysql的文档?/p>

MySQL最新的JDBC驱动E序包中提供了一个驱动类是 com.mysql.jdbc.ReplicationDriver 。这个驱动类允许在url中设|多个mysqlL地址Q例如:

jdbc:mysql://master1,slave1,slave2/dlog?autoReconnect=true&roundRobinLoadBalance=true

在上面的url中,有三个主机地址分别是master1,slave1,slave2Q其?/font>ReplicationDriver 规定W一个主机是masterL地址Q剩下的全部是slaveL。另外有两个参数必须指定为trueQ就是autoReconnect和roundRobinLoadBalance?/font>

使用q个驱动和配|后q不能马上解x有的问题Q我们还需要对E序做一些小改动?/p>

我们必须告诉驱动E序Q哪些语句的执行是作用在master数据库,而哪些语句的执行作用在slave数据库上?/p>

ReplicationDriver 是通过Connection对象的readOnly属性来判断该操作是否ؓ更新操作。因此我们在执行一个sql语句的时候必调用一下setReadOnly告诉驱动E序当前执行的操作是否是只读。如果你是用hibernate操作数据库的Q那可以调用Query.setReadOnlyҎ?/p>

以上是整个思\的大概描qͼ猜想肯定q有存在一些问题,例如因ؓ数据的复制过E是异步的,也是说有可能执行了某个更新操作,但是查询的时候查不到的情况出现。当然这些问题只能在实际的过E中q行解决?/p>

另外关于最新版本的MySQL 5.1有一个集的功能Q不q经q研I发现这个东西简直就是儿戏,实在搞不懂MySQL怎么会做q么不负责Q的设计,因ؓq个Ҏ要求数据库是整个load到内存中的,也就是说你的数据有多大,内存得有多大,怎么说呢Q?如果你真的内存够大Q你去试试吧Q反正这U方案已l被我否决了Q希望MySQL能改q一下?/p>



pony 2008-03-21 19:03 发表评论
]]>
վ֩ģ壺 Ƭ߹ۿ| ɫwwwվ| ձѵӰһ| ƷվƵ| ߹ۿƵ| ߿ѹۿAVҹӰԺ | ɫAVɫһ| Ļ߾ƷӰ| һëƬһëƬaa| þþþ뾫Ʒպ | 8x8xƵ| ޾Ʒav| һ| Ļ޾Ʒ| Ļһ| ˹mvƵ| ޸պƷһ| japaneseɫ߿| ߹ۿѻɫַ| һ| Ƭ߹ۿ| ŷձ߹ۿ| ɫ͵Ʒһ| Ƶһ| þþƵ| þ޹Ƶ| ߹ۿѹۿ| aƬѹۿ| þsmȤ| һػ¼Ѳŷ| Ƶ߹ۿ | ¾þƵ| 99ƵƷƵ7| videos| 91ѹƷ| ޳ɫWWWþվ| AV鶹Ʒ| Ůҹ24ʽƵ| ƷۺרƬþþ| av߹ۿ| պƷר |