??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲中文字幕AV在天堂,亚洲AV成人无码久久精品老人 ,伊人久久亚洲综合影院http://m.tkk7.com/lcs868/articles/343319.html李春?/dc:creator>李春?/author>Fri, 21 Jan 2011 05:40:00 GMThttp://m.tkk7.com/lcs868/articles/343319.htmlhttp://m.tkk7.com/lcs868/comments/343319.htmlhttp://m.tkk7.com/lcs868/articles/343319.html#Feedback0http://m.tkk7.com/lcs868/comments/commentRss/343319.htmlhttp://m.tkk7.com/lcs868/services/trackbacks/343319.html今天

select * from 表名 where to_days(旉字段? = to_days(now());

昨天

SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 旉字段? <= 1

7?br />
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(旉字段?

q?0?br />
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(旉字段?

本月

SELECT * FROM 表名 WHERE DATE_FORMAT( 旉字段? '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )

上一?br />
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 旉字段? '%Y%m' ) ) =1


]]>
mysql date_format 按不同时间单位进行分l统计 http://m.tkk7.com/lcs868/articles/343320.html李春?/dc:creator>李春?/author>Fri, 21 Jan 2011 05:40:00 GMThttp://m.tkk7.com/lcs868/articles/343320.htmlhttp://m.tkk7.com/lcs868/comments/343320.htmlhttp://m.tkk7.com/lcs868/articles/343320.html#Feedback0http://m.tkk7.com/lcs868/comments/commentRss/343320.htmlhttp://m.tkk7.com/lcs868/services/trackbacks/343320.html Ҏ(gu)format字符串格式化date倹{下列修饰符可以被用在format字符串中Q?nbsp;  
%M     月名?January……December)     
%W     星期名字(Sunday……Saturday)     
%D     有英语前~的月份的日期(1st,   2nd,   3rd,   {等。)   
%Y     q?   数字,   4   ?nbsp;  
%y     q?   数字,   2   ?nbsp;  
%a     ~写的星期名?Sun……Sat)     
%d     月䆾中的天数,   数字(00……31)     
%e     月䆾中的天数,   数字(0……31)     
%m     ?   数字(01……12)     
%c     ?   数字(1……12)     
%b     ~写的月份名?Jan……Dec)     
%j     一q中的天?001……366)     
%H     时(00……23)     
%k     时(0……23)     
%h     时(01……12)     
%I     时(01……12)     
%l     时(1……12)     
%i     分钟,   数字(00……59)     
%r     旉,12   时(hh:mm:ss   [AP]M)     
%T     旉,24   时(hh:mm:ss)     
%S     U?00……59)     
%s     U?00……59)     
%p     AM或PM     
%w     一个星期中的天?0=Sunday   ……6=Saturday   Q?nbsp;  
%U     星期(0……52),   q里星期天是星期的第一?nbsp;  
%u     星期(0……52),   q里星期一是星期的W一?nbsp;  
%%     一个文?#8220;%”?nbsp;    
  
所有的其他字符不做解释被复制到l果中?nbsp;  
  
mysql>   select   DATE_FORMAT('1997-10-04   22:23:00',   '%W   %M   %Y');
                  ->   'Saturday   October   1997'
mysql>   select   DATE_FORMAT('1997-10-04   22:23:00',   '%H:%i:%s');
                  ->   '22:23:00'
mysql>   select   DATE_FORMAT('1997-10-04   22:23:00',
                                                      '%D   %y   %a   %d   %m   %b   %j');
                  ->   '4th   97   Sat   04   10   Oct   277'
mysql>   select   DATE_FORMAT('1997-10-04   22:23:00',
                                                      '%H   %k   %I   %r   %T   %S   %w');
                  ->   '22   22   10   10:23:00   PM   22:23:00   00   6'


, '%Y %m'


]]>
FusionCharts 的XML标签属?/title><link>http://m.tkk7.com/lcs868/articles/343307.html</link><dc:creator>李春?/dc:creator><author>李春?/author><pubDate>Fri, 21 Jan 2011 03:20:00 GMT</pubDate><guid>http://m.tkk7.com/lcs868/articles/343307.html</guid><wfw:comment>http://m.tkk7.com/lcs868/comments/343307.html</wfw:comment><comments>http://m.tkk7.com/lcs868/articles/343307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lcs868/comments/commentRss/343307.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lcs868/services/trackbacks/343307.html</trackback:ping><description><![CDATA[<p>FusionCharts 的XML标签属?<br /> FusionCharts ?XML标签属性有一下四U数据类?br /> * Boolean - 布尔cdQ只能ؓ(f)1或?。例如:(x)<graph showNames=’1′ ><br /> * Number - 数字cdQ只能ؓ(f)数字。例如:(x)<graph yAxisMaxValue=’200′ ><br /> * String - 字符串类型,只能为字W串。例如:(x) <graph caption=’My Chart’ ><br /> * Hex Color Code - 十六q制颜色代码Q前Ҏ(gu)?#8217;#’.例如Q?<graph bgColor=’FFFFDD’ ></p> <p>XML中的标签和属性有Q?br /> <graph> 所h的属?br /> flash背景参数Q?br /> * bgColor=”HexColorCode” : 讄flash的背景颜?br /> * bgAlpha=”NumericalValue(0-100)” : 讄背景的透明?br /> * bgSWF=”Path of SWF File” : 讄一个外部的Flash 为flash的背?br /> 图表背景参数Q?br /> * canvasBgColor=”HexColorCode” : 讄图表背景的颜?br /> * canvasBaseColor=”HexColorCode” : 讄图表基部的颜?br /> * canvasBaseDepth=”Numerical Value” : 讄图表基部的高?br /> * canvasBgDepth=”Numerical Value” : 讄图表背景的深?br /> * showCanvasBg=”1/0″ : 讄是否昄图表背景<br /> * showCanvasBase=”1/0″ : 讄是否昄图表基部<br /> 图表和u的标?br /> * caption=”String” : 图表上方的标?br /> * subCaption=”String” : 图表上方的副标题<br /> * xAxisName= “String” : X轴的名字<br /> * yAxisName= “String” : y轴的名字<br /> 图表数量值的限制<br /> * yAxisMinValue=”value”: y轴最?br /> * yAxisMaxValue=”value”: y舟最大?br /> 通用参数<br /> * shownames=”1/0″ : 讄是否在x轴下昄<set>里指定的name<br /> * showValues=”1/0″ : 讄是否在柱型图或饼型图上显C数据的?br /> * showLimits=”1/0″ : 讄是否在图表的y轴坐标上昄最大最的数据?br /> * rotateNames=”1/0″ : 讄x轴下的name 是水qxC是垂直显C?br /> * animation=”1/0″ : 讄柱型囄昄是否是动LC?br /> 字体属?br /> * baseFont=”FontName” : 讄字体样式<br /> * baseFontSize=”FontSize” : 讄字体大小<br /> * baseFontColor=”HexColorCode” : 讄字体颜色<br /> * outCnvBaseFont = “FontName” : 讄图表外侧的字体样?br /> * outCnvBaseFontSze=”FontSize” : 讄图表外侧的字体大?br /> * outCnvBaseFontColor=”HexColorCode”: 讄图表外侧的字体颜?br /> 数字格式选项<br /> * numberPrefix=”$” : 讄数据值的前缀<br /> * numberSuffix=”p.a” : 讄数据值的后缀Q如果是Ҏ(gu)字符Q需要用URL Encode重编码)<br /> * formatNumber=”1/0″ : 讄是否格式化数?br /> * formatNumberScale=”1/0″ : 讄是否?#8220;K”来代表千Q?#8220;M”来代表百?br /> * decimalSeparator=”.” : 用指定的字符来代替小数点<br /> * thousandSeparator=”,” : 用指定的字符来代替千位分隔符<br /> * decimalPrecision=”2″ : 讄十进制的_ֺ<br /> * divLineDecimalPrecision=”2″: 讄y轴数值的数位数<br /> * limitsDecimalPrecision=”2″ : 讄y轴的最大最值的数位数<br /> 水^分隔U?br /> * numdivlines=”NumericalValue” : 讄水^分隔U的数量<br /> * divlinecolor=”HexColorCode” : 讄水^分隔U的颜色<br /> * divLineThickness=”NumericalValue” : 讄水^分隔U的宽度<br /> * divLineAlpha=”NumericalValue0-100″ : 讄水^分隔U的透明?br /> * showDivLineValue=”1/0″ : 讄是否昄水^分隔U的数?br /> 鼠标旋停参数<br /> * showhovercap=”1/0″ : 昄是否Ȁz鼠标旋停效?br /> * hoverCapBgColor=”HexColorCode” : 讄鼠标旋停效果的背景颜?br /> * hoverCapBorderColor=”HexColorCode” : 讄鼠标旋停效果的边框颜?br /> * hoverCapSepChar=”Char” : 讄鼠标旋停后显C的文本中的分隔W号<br /> 图表边距的设|?br /> * chartLeftMargin=”Numerical Value (in pixels)” : 讄图表左边?br /> * chartRightMargin=”Numerical Value (in pixels)” : 讄图表双?br /> * chartTopMargin=”Numerical Value (in pixels)” : 讄图表上边?br /> * chartBottomMargin=”Numerical Value (in pixels)” : 讄图表下边?br /> Zero Plane<br /> The zero plane is a 3D plane that signifies the 0 position on the chart. If there are no negative numbers on the chart, you won’t see a visible zero plane.<br /> * zeroPlaneShowBorder=”1/0″ : Whether the border of a 3D zero plane would be plotted or not.<br /> * zeroPlaneBorderColor=”Hex Code” : If the border is to be plotted, this attribute sets the border color for the plane.<br /> * zeroPlaneColor=”Hex Code” : The intended color for the zero plane.<br /> * zeroPlaneAlpha=”Numerical Value 0-100″ : The intended transparency for the zero plane. </p> <p><set> 所h的属?br /> * name=”string” : 讄在图表中体现出来的名?br /> Example: <set name=’Jan’ …><br /> * value=”NumericalValue” : 讄在图表中各个名字惛_应的?br /> Example: <set name=’Jan’ value=’12345′ …><br /> * color=”HexCode” : 讄在图表中相对应的p囄颜色<br /> Example: <set name=’Jan’ value=’12345′ color=’636363′ …><br /> * hoverText=”String value” : 讄鼠标旋停在相对应的柱行图 上出现的文本内容<br /> Example: <set name=’Jan’ value=’12345′ color=’636363′ hoverText=’January’…><br /> * link=”URL” : 讄该柱行图的链接地址Q需要URL Encode重编码)<br /> Example: <set … link=’ShowDetails.asp%3FMonth=Jan’ …><br /> * alpha=”Numerical Value 0-100″ : 讄在图表中相对应的p囄透明?br /> Example: <set … alpha=’100′ …><br /> * showName=”1″ : 讄在是否显C图表中相对应的p囄name<br /> Example : <set … showName=”1″ …></p> <p> </p> <p><br /> 功能Ҏ(gu)?br /> animation                    是否动画昄数据Q默认ؓ(f)1(True)<br /> showNames                    是否昄横向坐标?x?标签名称<br /> rotateNames                是否旋{昄标签Q默认ؓ(f)0(False):横向昄<br /> showValues                    是否在图表显C对应的数据|默认?(True)<br /> yAxisMinValue                指定Uu(y?最|数字<br /> yAxisMaxValue                 指定Uu(y?最|数字<br /> showLimits                    是否昄图表限?y轴最大、最?Q默认ؓ(f)1(True)</p> <p>图表标题和u名称 <br /> caption                    图表L?br /> subCaption                    图表副标?br /> xAxisName                    横向坐标?x?名称<br /> yAxisName                    U向坐标?y?名称</p> <p>图表和画布的样式<br /> bgColor                    图表背景Ԍ6?6q制颜色?br /> canvasBgColor                d背景Ԍ6?6q制颜色?br /> canvasBgAlpha                d透明度,[0-100]<br /> canvasBorderColor            dҎ(gu)颜色Q??6q制颜色?br /> canvasBorderThickness        dҎ(gu)厚度Q[0-100]<br /> shadowAlpha                投媄透明度,[0-100]<br /> showLegend                    是否昄pd名,默认?(True)</p> <p>字体属?br /> baseFont                    图表字体样式<br /> baseFontSize                图表字体大小<br /> baseFontColor                图表字体颜色Q??6q制颜色?br /> outCnvBaseFont                图表d以外的字体样?br /> outCnvBaseFontSize            图表d以外的字体大?br /> outCnvBaseFontColor        图表d以外的字体颜Ԍ6?6q制颜色?/p> <p>分区U和|格<br /> numDivLines                d内部水^分区U条敎ͼ数字<br /> divLineColor                水^分区UKԌ6?6q制颜色?br /> divLineThickness            水^分区U厚度,[1-5]<br /> divLineAlpha                水^分区UK明度,[0-100]<br /> showAlternateHGridColor    是否在横向网格带交替的颜Ԍ默认?(False)<br /> alternateHGridColor        横向|格带交替的颜色Q??6q制颜色?br /> alternateHGridAlpha        横向|格带的透明度,[0-100]<br /> showDivLineValues            是否昄Div行的|默认Q?<br /> numVDivLines                d内部垂直分区U条敎ͼ数字<br /> vDivLineColor                垂直分区UKԌ6?6q制颜色?br /> vDivLineThickness            垂直分区U厚度,[1-5]<br /> vDivLineAlpha                垂直分区UK明度,[0-100]<br /> showAlternateVGridColor    是否在纵向网格带交替的颜Ԍ默认?(False)<br /> alternateVGridColor        U向|格带交替的颜色Q??6q制颜色?br /> alternateVGridAlpha        U向|格带的透明度,[0-100]</p> <p>数字格式<br /> numberPrefix                增加数字前缀<br /> numberSuffix                增加数字后缀    % ?'%25'<br /> formatNumberScale        是否格式化数?默认?(True),自动的给你的数字加上KQ千Q或MQ百万)Q若?,则不加K或M<br /> decimalPrecision            指定数位的位数Q[0-10]    例如Q?'0' 取整<br /> divLineDecimalPrecision    指定水^分区U的值小C的位敎ͼ[0-10]<br /> limitsDecimalPrecision        指定y轴最大、最值的数位的位数Q[0-10]<br /> formatNumber                逗号来分隔数?千位Q百万位),默认?(True)Q若?,则不加分隔符<br /> decimalSeparator            指定数分隔W?默认?.'<br /> thousandSeparator            指定千分位分隔符,默认?,'</p> <p>Tool-tip/Hover标题<br /> showhovercap                是否昄(zhn)停说明框,默认?(True)<br /> hoverCapBgColor            (zhn)停说明框背景色Q??6q制颜色?br /> hoverCapBorderColor        (zhn)停说明框边框颜Ԍ6?6q制颜色?br /> hoverCapSepChar            指定(zhn)停说明框内gg间分隔符,默认?,'</p> <p>折线囄参数<br /> lineThickness                折线的厚?br /> anchorRadius                折线节点半径Q数?br /> anchorBgAlpha                折线节点透明度,[0-100]<br /> anchorBgColor                折线节点填充颜色Q??6q制颜色?br /> anchorBorderColor            折线节点Ҏ(gu)颜色Q??6q制颜色?/p> <p>Set标签使用的参?br /> value                        数据?br /> color                        颜色<br /> link                        链接Q本H口打开[Url]Q新H口打开[n-Url]Q调用JS函数[JavaScript:函数]Q?br /> name                        横向坐标轴标{֐U?/p> <img src ="http://m.tkk7.com/lcs868/aggbug/343307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lcs868/" target="_blank">李春?/a> 2011-01-21 11:20 <a href="http://m.tkk7.com/lcs868/articles/343307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql常用命ohttp://m.tkk7.com/lcs868/articles/343306.html李春?/dc:creator>李春?/author>Fri, 21 Jan 2011 03:17:00 GMThttp://m.tkk7.com/lcs868/articles/343306.htmlhttp://m.tkk7.com/lcs868/comments/343306.htmlhttp://m.tkk7.com/lcs868/articles/343306.html#Feedback0http://m.tkk7.com/lcs868/comments/commentRss/343306.htmlhttp://m.tkk7.com/lcs868/services/trackbacks/343306.html1.Linuxpȝ下启动MySQL的命令:(x)

mysqladmin start

/ect/init.d/mysql start (前面为mysql的安装\?

2.linux下重启mysql的命令:(x)

mysqladmin restart

/ect/init.d/mysql restart (前面为mysql的安装\?

3.linux下关闭mysql的命令:(x)

mysqladmin shutdown

/ect/init.d/mysql shutdown (前面为mysql的安装\?

4.q接本机上的mysqlQ?/p>

q入目录mysql\binQ再键入命omysql -uroot -pQ?回R后提C入密码?/p>

退出mysql命oQexitQ回车)

5.修改mysql密码Q?/p>

mysqladmin -u用户?-p旧密?password 新密?/p>

或进入mysql命o行SET PASSWORD FOR root=PASSWORD("root");

6.增加新用戗(注意Qmysql环境中的命o后面都带一个分号作为命令结束符Q?/p>

grant select on 数据?* to 用户名@dL identified by "密码"

如增加一个用户test密码?23Q让他可以在ML上登录,q对所有数据库有查询、插入、修攏V删除的权限。首先用以root用户q入mysqlQ然后键入以下命令:(x)

grant select,insert,update,delete on *.* to " Identified by "123";

二、有关MySQL数据库方面的操作

必须首先d到mysql中,有关操作都是在mysql的提C符下进行,而且每个命o以分L(fng)?/p>

1、显C数据库列表?/p>

show databases;

2、显C库中的数据表:(x)

use mysqlQ?Q/打开?/p>

show tables;

3、显C数据表的结构:(x)

describe 表名;

4、徏库:(x)

create database 库名;

5、徏表:(x)

use 库名Q?/p>

create table 表名(字段讑֮列表)Q?/p>

6、删库和删表:

drop database 库名;

drop table 表名Q?/p>

7、将表中记录清空Q?/p>

delete from 表名;

8、显C中的记录Q?/p>

select * from 表名;

9、编码的修改

如果要改变整个mysql的编码格式:(x)

启动mysql的时候,mysqld_safe命o行加?/p>

--default-character-set=gbk

如果要改变某个库的编码格式:(x)在mysql提示W后输入命o

alter database db_name default character set gbk;

三、数据的导入导出

1、文本数据{到数据库?/p>

文本数据应符合的格式Q字D|据之间用tab键隔开Qnull值用来代ѝ例Q?/p>

1 name duty 2006-11-23

数据传入命o load data local infile "文g? into table 表名;

2、导出数据库和表

mysqldump --opt news > news.sqlQ将数据库news中的所有表备䆾到news.sql文gQnews.sql是一个文本文Ӟ文g名Q取。)

mysqldump --opt news author article > author.article.sqlQ将数据库news中的author表和article表备份到author.article.sql文gQ?author.article.sql是一个文本文Ӟ文g名Q取。)

mysqldump --databases db1 db2 > news.sqlQ将数据库dbl和db2备䆾到news.sql文gQnews.sql是一个文本文Ӟ文g名Q取。)

mysqldump -h host -u user -p pass --databases dbname > file.dump

是把host上的以名字userQ口令pass的数据库dbname导入到文件file.dump?/p>

mysqldump --all-databases > all-databases.sqlQ将所有数据库备䆾到all-databases.sql文gQall-databases.sql是一个文本文Ӟ文g名Q取。)

3、导入数?/p>

mysql < all-databases.sqlQ导入数据库Q?/p>

mysql>source news.sql;Q在mysql命o下执行,可导入表Q?/p>

一、连接MySQL

格式Q?mysql -hL地址 -u用户?Qp用户密码

1、例1Q连接到本机上的MYSQL?/p>

首先在打开DOSH口Q然后进入目?mysqlbinQ再键入命omysql -uroot -pQ回车后提示你输密码Q如果刚安装好MYSQLQ超U用户root是没有密码的Q故直接回R卛_q入到MYSQL中了QMYSQL的提C符是:(x) mysql>?/p>

2、例2Q连接到q程L上的MYSQL。假设远E主机的IP为:(x)110.110.110.110Q用户名为root,密码为abcd123。则键入以下命oQ?/p>

mysql -h110.110.110.110 -uroot -pabcd123

Q注:u与root可以不用加空|其它也一P

3、退出MYSQL命oQ?exit Q回车)?/p>

二、修改密?/p>

格式Qmysqladmin -u用户?-p旧密?password 新密?/p>

1、例1Q给root加个密码ab12。首先在DOS下进入目录mysqlbinQ然后键入以下命令:(x)

mysqladmin -uroot -password ab12

注:(x)因ؓ(f)开始时root没有密码Q所?p旧密码一就可以省略了?/p>

2、例2Q再root的密码改为djg345?/p>

mysqladmin -uroot -pab12 password djg345

三、增加新用户。(注意Q和上面不同Q下面的因ؓ(f)是MySQL环境中的命oQ所以后面都带一个分号作为命令结束符Q?/p>

格式Qgrant select on 数据?* to 用户名@dL identified by \"密码\"

?、增加一个用户test1密码为abcQ让他可以在ML上登录,q对所有数据库有查询、插入、修攏V删除的权限。首先用以root用户q入MySQLQ然后键入以下命令:(x)

grant select,insert,update,

delete on *.* to test1@\"%\" Identified by \"abc\";

但例1增加的用h十分危险的,你想如某个h知道test1的密码,那么他就可以在internet上的M一台电(sh)脑上d你的MySQL数据库ƈ对你的数据可以ؓ(f)所Ʋؓ(f)了,解决办法见例2?/p>

?、增加一个用户test2密码为abc,让他只可以在localhost上登录,q可以对数据库mydbq行查询、插入、修攏V删除的操作Qlocalhost指本C机,即MySQL数据库所在的那台LQ,q样用户即用知道test2的密码,他也无法从internet上直接访问数据库Q只能通过MySQLL上的web|讉K?/p>

grant select,insert,update,

delete on mydb.* to test2@localhost identified by \"abc\";

如果你不想test2有密码,可以再打一个命令将密码消掉?/p>

grant select,insert,update,delete on mydb

.* to test2@localhost identified by \"\";

在上面讲了登录、增加用戗密码更改等问题。下面我们来看看MySQL中有x据库斚w的操作。注意:(x)你必首先登录到MySQL中,以下操作都是在MySQL的提C符下进行的Q而且每个命o以分L(fng)束?/p>

一、操作技?/p>

1、如果你打命令时Q回车后发现忘记加分P你无重打一遍命令,只要打个分号回R可以了。也是说你可以把一个完整的命o分成几行来打Q完后用分号作结束标志就完成?/p>

2、你可以使用光标上下键调Z前的命o。但以前我用q的一个MySQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win?/p>

二、显C命?/p>

1、显C数据库列表Q?/p>

show databases;

刚开始时才两个数据库Qmysql和test。MySQL库很重要它里面有MYSQL的系l信息,我们改密码和新增用户Q实际上是用这个库q行操作?/p>

2、显C库中的数据表:(x)

use mysqlQ?Q/打开库,学过FOXBASE的一定不?x)陌生?/p>

show tables;

3、显C数据表的结构:(x)

describe 表名;

4、徏库:(x)

create database 库名;

5、徏表:(x)

use 库名Q?/p>

create table 表名 (字段讑֮列表)Q?/p>

6、删库和删表:

drop database 库名;

drop table 表名Q?/p>

7、将表中记录清空Q?/p>

delete from 表名;

8、显C中的记录Q?/p>

select * from 表名;

三、一个徏库和以及插入数据的实?/p>

drop database if exists school; //如果存在SCHOOL则删?/p>

create database school; //建立库SCHOOL

use school; //打开库SCHOOL

create table teacher //建立表TEACHER

(

id int(3) auto_increment not null primary key,

name char(10) not null,

address varchar(50) default ’深圳’,

year date

); //l束

//以下为插入字D?/p>

insert into teacher values(’’,’glchengang’,’深圳一?#8217;,’1976-10-10’);

insert into teacher values(’’,’jack’,’深圳一?#8217;,’1975-12-23’);

注:(x)在徏表中Q?Q将ID设ؓ(f)长度?的数字字D?int(3)q让它每个记录自动加一:auto_incrementq不能ؓ(f)I?not null而且让他成ؓ(f)dDprimary keyQ?Q将NAME设ؓ(f)长度?0的字W字D(3Q将ADDRESS设ؓ(f)长度50的字W字D,而且~省gؓ(f)深圳。varchar和char有什么区别呢Q只有等以后的文章再说了。(4Q将YEAR设ؓ(f)日期字段?/p>

如果你在MySQL提示W键入上面的命o也可以,但不方便调试。你可以以上命令原样写入一个文本文件中假设为school.sqlQ然后复制到c:\\下,q在DOS状态进入目录\\mysql\\binQ然后键入以下命令:(x)

mysql -uroot -p密码 < c:\\school.sql

如果成功Q空Z行无M昄Q如有错误,?x)有提示。(以上命o已经调试Q你只要?/的注释去掉即可用)?/p>

四、将文本数据转到数据库中

1、文本数据应W合的格式:(x)字段数据之间用tab键隔开Qnull值用\\n来代ѝ?/p>

例:(x)

3 rose 深圳二中 1976-10-10

4 mike 深圳一?1975-12-23

2、数据传入命?load data local infile \"文g名\" into table 表名?/p>

注意Q你最好将文g复制到\\mysql\\bin目录下,q且要先用use命o打表所在的库?/p>

五、备份数据库Q?/p>

1、mysqldump --opt school>school.bbb

mysqldump --opt school>school.bbb

Q命令在DOS的\\mysql\\bin目录下执行)

注释:数据库school备䆾到school.bbb文gQschool.bbb是一个文本文Ӟ文g名Q取,打开看看你会(x)有新发现?/p>

后记Q其实MySQL的对数据库的操作与其它的SQLcL据库大同异Q?zhn)最好找本将SQL的书看看。我在这里只介绍一些基本的Q其实我也就只懂q些了,呵呵。最好的MYSQL教程q是“晏子“译的“MYSQL中文参考手?#8220;不仅免费每个相关|站都有下蝲Q而且它是最权威的。可惜不是象\"PHP4中文手册\"那样是chm的格式,在查扑և数命令的时候不太方ѝ?/p>

2、修改登录密?/p>

1) mysqladmin -u用户?-p旧密?password 新密?

例:(x)mysqladmin -u root password 21century

注:(x)因ؓ(f)开始时root没有密码Q所?p旧密码一就可以省略了?/p>

2)直接修改user表的root用户口oQ?/p>

mysql> user mysql;

mysql> update user set pasword=password('21century') where user='root';

mysql> flush privileges;

注:(x)flush privileges的意思是强制h内存授权表,否则用的q是~冲中的口o?/p>

3、测试密码是否修Ҏ(gu)?

1Q不用密码登?

[root@test1 local]# mysql

ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)

昄错误Q说明密码已l修攏V?/p>

2Q用修改后的密码d:

[root@test1 local]# mysql -u root -p

Enter password: (输入修改后的密码21century)

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 177 to server version: 3.23.48

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

成功Q?/p>

q是通过mysqladmin命o修改口oQ也可通过修改库来更改口o?/p>

4、启动和停止:

启动QMysql?.23.15版本开始作了改动,默认安装后服务要用MySQL用户来启动,不允许root用户启动?/p>

如果非要用root用户来启动,必须加上--user=root参数(./safe_mysqld --user=root &)停止Qmysqladmin -u root -p shutdown?/p>

5、导出meeting数据库:(x)

mysqldump -uroot -p21century meeting > db_meeting.sql

ghdbname数据?

mysqldump -uroot -p21century dbname < xxx.sql

导入数据库还可用cM于oracle中@my_script.sql的方式一ơ执行大量sql语句Q这在用mysqldump不v作用旉常有用?/p>

例:(x)#./mysql -uroot -p < /home/xuys/db_meeting_2003.sql

(注:(x)create database、use databasename、create table和insert into语句都可写在上面的脚步文件中)

6、给表改?

RENAME TABLE ztemp TO zteMP4;

7、修改字D属性:(x)

ALTER TABLE bbabase CHANGE news_id id VARCHAR(5) NOT NULL;

8、在表中的content后增加一字段Q?/p>

ALTER TABLE bbabase ADD leave_time DATETIME NOT NULL AFTER



]]>
mysql安装http://m.tkk7.com/lcs868/articles/343305.html李春?/dc:creator>李春?/author>Fri, 21 Jan 2011 03:16:00 GMThttp://m.tkk7.com/lcs868/articles/343305.htmlhttp://m.tkk7.com/lcs868/comments/343305.htmlhttp://m.tkk7.com/lcs868/articles/343305.html#Feedback0http://m.tkk7.com/lcs868/comments/commentRss/343305.htmlhttp://m.tkk7.com/lcs868/services/trackbacks/343305.html shell> useradd -g mysql mysql
shell> gunzip < mysql-VERSION.tar.gz | tar -xvf -
shell> cd mysql-VERSION
shell> ./configure --prefix=/usr/local/mysql
shell> make
shell> make install
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> cd /usr/local/mysql
shell> bin/mysql_install_db --user=mysql
shell> chown -R root  .
shell> chown -R mysql var
shell> chgrp -R mysql .
shell> bin/mysqld_safe --user=mysql &

]]>
linuxpȝ下jdk1.6安装http://m.tkk7.com/lcs868/articles/343304.html李春?/dc:creator>李春?/author>Fri, 21 Jan 2011 03:14:00 GMThttp://m.tkk7.com/lcs868/articles/343304.htmlhttp://m.tkk7.com/lcs868/comments/343304.htmlhttp://m.tkk7.com/lcs868/articles/343304.html#Feedback0http://m.tkk7.com/lcs868/comments/commentRss/343304.htmlhttp://m.tkk7.com/lcs868/services/trackbacks/343304.html1. 从网站上下蝲jdk1.6?jdk-6u10-linux-i586-rpm.bin ),通过leapFTP上传到l(f)inuxpȝ?var/ftp/pub目录?/p>

 

  2.在linux中切换到 /var/ftp/pub目录下,修改jdk1.6的用权限:(x)#chmod  u+x  jdk-6u10-linux-i586-rpm.bin

 

  3.解压q安装:(x)#./ jdk-6u10-linux-i586-rpm.bin (默认安装?usr/java?

 

  4.环境变量配置Q?/p>

    #vi  /etc/profile

    在该profile文g中添加:(x)

    JAVA_HOME=/usr/java/jdk1.6.0_10

    JRE_HOME=/usr/java/jdk1.6.0_10/jre

    PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

    CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

    export JAVA_HOME JRE_HOME PATH CLASSPATH

    d完毕保存退?/p>

 

    #source /etc/profile

    #java -version

    昄 java version "1.6.0_10" (jdk1.6安装成功)

 

   卸蝲rpm版的jdkQ?/p>

   #rpm -qa|grep jdk

   昄Qjdk-1.6.0_10-fcs
   卸蝲Q?rpm -e  --nodeps  jdk-1.6.0_10-fcs



]]>
mysql slave,master配置http://m.tkk7.com/lcs868/articles/343303.html李春?/dc:creator>李春?/author>Fri, 21 Jan 2011 03:09:00 GMThttp://m.tkk7.com/lcs868/articles/343303.htmlhttp://m.tkk7.com/lcs868/comments/343303.htmlhttp://m.tkk7.com/lcs868/articles/343303.html#Feedback0http://m.tkk7.com/lcs868/comments/commentRss/343303.htmlhttp://m.tkk7.com/lcs868/services/trackbacks/343303.html一个完整的mysqld分离环境包括以下几个部分Q?/p>

应用E序client
database proxy
database集群
在本ơ实战中Q应用程序clientZc3p0q接后端的database proxy。database proxy负责理client实际讉Kdatabase的\q略,采用开源框架amoeba。database集群采用mysql的master-slave的replicationҎ(gu)。整个环境的l构囑֦下所C:(x)

 

实战步骤与详?/p>

一.搭徏mysql的master-slave环境

1Q分别在host1Q?0.20.147.110Q和host2Q?0.20.147.111Q上安装mysqlQ?.0.45Q,具体安装Ҏ(gu)可见官方文

2Q配|master

首先~辑/etc/my.cnfQ添加以下配|:(x)

log-bin=mysql-bin #slave?x)基于此log-bin来做replication
server-id=1 #master的标C?br /> binlog-do-db = amoeba_study #用于master-slave的具体数据库

然后d专门用于replication的用P(x)

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@10.20.147.111 IDENTIFIED BY '111111';

重启mysqlQ得配|生效:(x)

/etc/init.d/mysqld restart

最后查看master状态:(x)

 

3Q配|slave

首先~辑/etc/my.cnfQ添加以下配|:(x)

server-id=2 #slave的标C?/p>

配置生效后,配置与master的连接:(x)

mysql> CHANGE MASTER TO
    -> MASTER_HOST='10.20.147.110',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='111111',
    -> MASTER_LOG_FILE='mysql-bin.000003',
    -> MASTER_LOG_POS=161261;

其中MASTER_HOST是master机的ipQMASTER_USER和MASTER_PASSWORD是我们刚才在master上添加的用户QMASTER_LOG_FILE和MASTER_LOG_POS对应与master status里的信息

最后启动slaveQ?/p>

mysql> start slave;

4Q验证master-slave搭徏生效

通过查看slave机的logQ?var/log/mysqld.logQ:(x)

100703 10:51:42 [Note] Slave I/O thread: connected to master 'repl@10.20.147.110:3306',  replication started in log 'mysql-bin.000003' at position 161261

如看C上信息则证明搭徏成功Q如果有问题也可通过此log扑֎?/p>

?搭徏database proxy

此次实战中database proxy采用amoeba Q它的相关信息可以查阅官Ҏ(gu),不在此详q?/p>

1Q安装amoeba

下蝲amoebaQ?.2.0-GAQ后解压到本圎ͼD:\openSource\amoeba-mysql-1.2.0-GAQ,卛_成安?/p>

2Q配|a(chn)moeba

先配|proxyq接和与各后端mysql服务器连接信息(D:\openSource\amoeba-mysql-1.2.0-GA\conf\amoeba.xmlQ:(x)

<server> 
    <!-- proxy serverl定的端?--> 
    <property name="port">8066</property> 
      
    <!-- proxy serverl定的IP --> 
    <!--  
    <property name="ipAddress">127.0.0.1</property> 
     --> 
    <!-- proxy server net IO Read thread size --> 
    <property name="readThreadPoolSize">20</property> 
      
    <!-- proxy server client process thread size --> 
    <property name="clientSideThreadPoolSize">30</property> 
      
    <!-- mysql server data packet process thread size --> 
    <property name="serverSideThreadPoolSize">30</property> 
      
    <!-- socket Send and receive BufferSize(unit:K)  --> 
    <property name="netBufferSize">128</property> 
      
    <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). --> 
    <property name="tcpNoDelay">true</property> 
      
    <!-- 对外验证的用户名 --> 
    <property name="user">root</property> 
      
    <!-- 对外验证的密?--> 
    <property name="password">root</property> 
</server> 
<server>
 <!-- proxy serverl定的端?-->
 <property name="port">8066</property>
 
 <!-- proxy serverl定的IP -->
 <!--
 <property name="ipAddress">127.0.0.1</property>
  -->
 <!-- proxy server net IO Read thread size -->
 <property name="readThreadPoolSize">20</property>
 
 <!-- proxy server client process thread size -->
 <property name="clientSideThreadPoolSize">30</property>
 
 <!-- mysql server data packet process thread size -->
 <property name="serverSideThreadPoolSize">30</property>
 
 <!-- socket Send and receive BufferSize(unit:K)  -->
 <property name="netBufferSize">128</property>
 
 <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
 <property name="tcpNoDelay">true</property>
 
 <!-- 对外验证的用户名 -->
 <property name="user">root</property>
 
 <!-- 对外验证的密?-->
 <property name="password">root</property>
</server>

以上是proxy提供lclient的连接配|?/p>

<dbServerList> 
    <dbServer name="server1">           
        <!-- PoolableObjectFactory实现c?--> 
        <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> 
            <property name="manager">defaultManager</property> 
              
            <!-- 真实mysql数据库端?--> 
            <property name="port">3306</property> 
              
            <!-- 真实mysql数据库IP --> 
            <property name="ipAddress">10.20.147.110</property> 
            <property name="schema">amoeba_study</property> 
              
            <!-- 用于登陆mysql的用户名 --> 
            <property name="user">root</property> 
              
            <!-- 用于登陆mysql的密?--> 
            <property name="password"></property> 
              
        </factoryConfig> 
          
        <!-- ObjectPool实现c?--> 
        <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> 
            <property name="maxActive">200</property> 
            <property name="maxIdle">200</property> 
            <property name="minIdle">10</property> 
            <property name="minEvictableIdleTimeMillis">600000</property> 
            <property name="timeBetweenEvictionRunsMillis">600000</property> 
            <property name="testOnBorrow">true</property> 
            <property name="testWhileIdle">true</property> 
        </poolConfig> 
    </dbServer> 
    <dbServer name="server2"> 
          
        <!-- PoolableObjectFactory实现c?--> 
        <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> 
            <property name="manager">defaultManager</property> 
              
            <!-- 真实mysql数据库端?--> 
            <property name="port">3306</property> 
              
            <!-- 真实mysql数据库IP --> 
            <property name="ipAddress">10.20.147.111</property> 
            <property name="schema">amoeba_study</property> 
              
            <!-- 用于登陆mysql的用户名 --> 
            <property name="user">root</property> 
              
            <!-- 用于登陆mysql的密?--> 
            <property name="password"></property> 
              
        </factoryConfig> 
          
        <!-- ObjectPool实现c?--> 
        <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> 
            <property name="maxActive">200</property> 
            <property name="maxIdle">200</property> 
            <property name="minIdle">10</property> 
            <property name="minEvictableIdleTimeMillis">600000</property> 
            <property name="timeBetweenEvictionRunsMillis">600000</property> 
            <property name="testOnBorrow">true</property> 
            <property name="testWhileIdle">true</property> 
        </poolConfig> 
    </dbServer>         
</dbServerList> 
<dbServerList>
 <dbServer name="server1">   
  <!-- PoolableObjectFactory实现c?-->
  <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
   <property name="manager">defaultManager</property>
   
   <!-- 真实mysql数据库端?-->
   <property name="port">3306</property>
   
   <!-- 真实mysql数据库IP -->
   <property name="ipAddress">10.20.147.110</property>
   <property name="schema">amoeba_study</property>
   
   <!-- 用于登陆mysql的用户名 -->
   <property name="user">root</property>
   
   <!-- 用于登陆mysql的密?-->
   <property name="password"></property>
   
  </factoryConfig>
  
  <!-- ObjectPool实现c?-->
  <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
   <property name="maxActive">200</property>
   <property name="maxIdle">200</property>
   <property name="minIdle">10</property>
   <property name="minEvictableIdleTimeMillis">600000</property>
   <property name="timeBetweenEvictionRunsMillis">600000</property>
   <property name="testOnBorrow">true</property>
   <property name="testWhileIdle">true</property>
  </poolConfig>
 </dbServer>
 <dbServer name="server2">
  
  <!-- PoolableObjectFactory实现c?-->
  <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
   <property name="manager">defaultManager</property>
   
   <!-- 真实mysql数据库端?-->
   <property name="port">3306</property>
   
   <!-- 真实mysql数据库IP -->
   <property name="ipAddress">10.20.147.111</property>
   <property name="schema">amoeba_study</property>
   
   <!-- 用于登陆mysql的用户名 -->
   <property name="user">root</property>
   
   <!-- 用于登陆mysql的密?-->
   <property name="password"></property>
   
  </factoryConfig>
  
  <!-- ObjectPool实现c?-->
  <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
   <property name="maxActive">200</property>
   <property name="maxIdle">200</property>
   <property name="minIdle">10</property>
   <property name="minEvictableIdleTimeMillis">600000</property>
   <property name="timeBetweenEvictionRunsMillis">600000</property>
   <property name="testOnBorrow">true</property>
   <property name="testWhileIdle">true</property>
  </poolConfig>
 </dbServer>  
</dbServerList>

以上是proxy与后端各mysql数据库服务器配置信息Q具体配|见注释很明白了

最后配|读写分ȝ略:(x)

<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"> 
    <property name="LRUMapSize">1500</property> 
    <property name="defaultPool">server1</property> 
    <property name="writePool">server1</property> 
    <property name="readPool">server2</property> 
    <property name="needParse">true</property> 
</queryRouter> 
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
 <property name="LRUMapSize">1500</property>
 <property name="defaultPool">server1</property>
 <property name="writePool">server1</property>
 <property name="readPool">server2</property>
 <property name="needParse">true</property>
</queryRouter>

从以上配|不然发玎ͼ写操作\由到server1QmasterQ,L作\由到server2QslaveQ?/p>

3Q启动amoeba

在命令行里运行D:\openSource\amoeba-mysql-1.2.0-GA\amoeba.bat卛_Q?/p>

log4j:WARN log4j config load completed from file:D:\openSource\amoeba-mysql-1.2.0-GA\conf\log4j.xml
log4j:WARN ip access config load completed from file:D:\openSource\amoeba-mysql-1.2.0-GA/conf/access_list.conf
2010-07-03 09:55:33,821 INFO  net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.
?client端调用与试

1Q编写client调用E序

具体E序l节׃详述了,只是一个最普通的Zmysql driver的jdbc的数据库操作E序

2Q配|数据库q接

本clientZc3p0Q具体数据源配置如下Q?/p>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
    <property name="jdbcUrl" value="jdbc:mysql://localhost:8066/amoeba_study" /> 
    <property name="user" value="root" /> 
    <property name="password" value="root" /> 
    <property name="minPoolSize" value="1" /> 
    <property name="maxPoolSize" value="1" /> 
    <property name="maxIdleTime" value="1800" /> 
    <property name="acquireIncrement" value="1" /> 
    <property name="maxStatements" value="0" /> 
    <property name="initialPoolSize" value="1" /> 
    <property name="idleConnectionTestPeriod" value="1800" /> 
    <property name="acquireRetryAttempts" value="6" /> 
    <property name="acquireRetryDelay" value="1000" /> 
    <property name="breakAfterAcquireFailure" value="false" /> 
    <property name="testConnectionOnCheckout" value="true" /> 
    <property name="testConnectionOnCheckin" value="false" /> 
</bean> 
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
 destroy-method="close">
 <property name="driverClass" value="com.mysql.jdbc.Driver" />
 <property name="jdbcUrl" value="jdbc:mysql://localhost:8066/amoeba_study" />
 <property name="user" value="root" />
 <property name="password" value="root" />
 <property name="minPoolSize" value="1" />
 <property name="maxPoolSize" value="1" />
 <property name="maxIdleTime" value="1800" />
 <property name="acquireIncrement" value="1" />
 <property name="maxStatements" value="0" />
 <property name="initialPoolSize" value="1" />
 <property name="idleConnectionTestPeriod" value="1800" />
 <property name="acquireRetryAttempts" value="6" />
 <property name="acquireRetryDelay" value="1000" />
 <property name="breakAfterAcquireFailure" value="false" />
 <property name="testConnectionOnCheckout" value="true" />
 <property name="testConnectionOnCheckin" value="false" />
</bean>

值得注意是,client端只需q到proxyQ与实际的数据库没有M关系Q因此jdbcUrl、user、password配置都对应于amoeba暴露出来的配|信?/p>

3Q调用与试

首先插入一条数据:(x)insert into zone_by_id(id,name) values(20003,'name_20003')

通过查看masterZ的日?var/lib/mysql/mysql_log.logQ?/p>

100703 11:58:42       1 Query       set names latin1
                      1 Query       SET NAMES latin1
                      1 Query       SET character_set_results = NULL
                      1 Query       SHOW VARIABLES
                      1 Query       SHOW COLLATION
                      1 Query       SET autocommit=1
                      1 Query       SET sql_mode='STRICT_TRANS_TABLES'
                      1 Query       SHOW VARIABLES LIKE 'tx_isolation'
                      1 Query       SHOW FULL TABLES FROM `amoeba_study` LIKE 'PROBABLYNOT'
                      1 Prepare     [1] insert into zone_by_id(id,name) values(?,?)
                      1 Prepare     [2] insert into zone_by_id(id,name) values(?,?)          
                      1 Execute     [2] insert into zone_by_id(id,name) values(20003,'name_20003')

得知写操作发生在masterZ

通过查看slaveZ的日?var/lib/mysql/mysql_log.logQ?/p>

100703 11:58:42       2 Query       insert into zone_by_id(id,name) values(20003,'name_20003')

得知slave同步执行了这条语?/p>

然后查一条数据:(x)select t.name from zone_by_id t where t.id = 20003

通过查看slaveZ的日?var/lib/mysql/mysql_log.logQ?/p>

100703 12:02:00      33 Query       set names latin1
                     33 Prepare     [1] select t.name from zone_by_id t where t.id = ?
                     33 Prepare     [2] select t.name from zone_by_id t where t.id = ?   
                     33 Execute     [2] select t.name from zone_by_id t where t.id = 20003 

得知L作发生在slaveZ

q且通过查看slaveZ的日?var/lib/mysql/mysql_log.log发现q条语句没在master上执?/p>

通过以上验证得知单的master-slave搭徏和实战得以生?/p>

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/cutesource/archive/2010/07/03/5710645.aspx



]]>
实现验证?/title><link>http://m.tkk7.com/lcs868/archive/2008/12/16/246654.html</link><dc:creator>李春?/dc:creator><author>李春?/author><pubDate>Tue, 16 Dec 2008 08:17:00 GMT</pubDate><guid>http://m.tkk7.com/lcs868/archive/2008/12/16/246654.html</guid><wfw:comment>http://m.tkk7.com/lcs868/comments/246654.html</wfw:comment><comments>http://m.tkk7.com/lcs868/archive/2008/12/16/246654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lcs868/comments/commentRss/246654.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lcs868/services/trackbacks/246654.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">以下cM?位验证码<br /> </span> <p><span style="font-size: 10pt">public class ImageTool{</span></p> <p><span style="font-size: 10pt">  private static Random random = new Random();</span></p> <p><span style="font-size: 10pt">  public ImageTool() {<br />   }</span></p> <p><span style="font-size: 10pt">  public static Color getRandColor(int fc,int bc){//l定范围获得随机颜色<br />     if(fc>255) fc=255;<br />     if(bc>255) bc=255;<br />     int r=fc+random.nextInt(bc-fc);<br />     int g=fc+random.nextInt(bc-fc);<br />     int b=fc+random.nextInt(bc-fc);<br />     return new Color(r,g,b);<br />   }</span></p> <p><span style="font-size: 10pt">  public static void outputImage(HttpSession session, HttpServletResponse response) throws IOException{</span></p> <p><span style="font-size: 10pt">    BufferedImage image = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);<br />     Graphics g = image.getGraphics();</span></p> <p><span style="font-size: 10pt">    g.setColor(getRandColor(200, 250));<br />     g.fillRect(0, 0, 60, 20);</span></p> <p><span style="font-size: 10pt">    g.setFont(new Font("Times New Roman",Font.PLAIN,18));</span></p> <p><span style="font-size: 10pt">    g.setColor(getRandColor(160, 200));<br />     for (int i=0;i<155;i++) {<br />       int x = random.nextInt(60);<br />       int y = random.nextInt(20);<br />       int xl = random.nextInt(12);<br />       int yl = random.nextInt(12);<br />       g.drawLine(x,y,x+xl,y+yl);<br />     }</span></p> <p><span style="font-size: 10pt">    StringBuffer randCode = new StringBuffer();<br />     for (int i=0;i<4;i++){<br />       String temp = String.valueOf(random.nextInt(10));<br />       randCode.append(temp);<br />       g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));<br />       g.drawString(temp,13*i+6,16);<br />     }<br />     session.setAttribute("randCode", randCode.toString());</span></p> <p><span style="font-size: 10pt">    g.dispose();<br />     OutputStream out=response.getOutputStream();</span></p> <p><span style="font-size: 10pt">    response.reset();<br />     ImageIO.write(image, "jpg", out);<br />     out.close();<br />   }</span></p> <p><span style="font-size: 10pt">  public static void imagePut(HttpSession session,OutputStream out,int pWidth,int pHeight,int pSize) throws IOException{</span></p> <p><span style="font-size: 10pt">    BufferedImage image = new BufferedImage(pWidth, pHeight, BufferedImage.TYPE_INT_RGB);<br />     Graphics g = image.getGraphics();</span></p> <p><span style="font-size: 10pt">    g.setColor(getRandColor(200, 250));<br />     g.fillRect(0, 0, pWidth, pHeight);</span></p> <p><span style="font-size: 10pt">    g.setFont(new Font("Times New Roman",Font.PLAIN,pSize));</span></p> <p><span style="font-size: 10pt">    g.setColor(getRandColor(160, 200));<br />     for (int i=0;i<18;i++) {<br />       int x = random.nextInt(60);<br />       int y = random.nextInt(20);<br />       int xl = random.nextInt(12);<br />       int yl = random.nextInt(12);<br />       g.drawLine(x,y,x+xl,y+yl);<br />     }</span></p> <p><span style="font-size: 10pt">    StringBuffer randCode = new StringBuffer();<br />     for (int i=0;i<4;i++){<br />       String temp = String.valueOf(random.nextInt(10));<br />       randCode.append(temp);<br />       g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));<br />       g.drawString(temp,13*i+6,16);<br />     }<br />     g.dispose();<br />     ImageIO.write(image, "jpg", out);<br />     session.setAttribute("randCode", randCode.toString());<br /> //    System.out.println("sessionIDQ?+session.toString()+"Q?产生的验证码Q?+session.getAttribute("randCode"));</span></p> <p><span style="font-size: 10pt">  }</span></p> <p><span style="font-size: 10pt">  public static void imagePutOneColor(HttpSession session,OutputStream out,int pWidth,int pHeight,int pSize) throws IOException{</span></p> <p><span style="font-size: 10pt">    BufferedImage image = new BufferedImage(pWidth, pHeight, BufferedImage.TYPE_INT_RGB);<br />     Graphics g = image.getGraphics();</span></p> <p><span style="font-size: 10pt">    g.setColor(new Color(255,255,255));<br />     g.fillRect(0, 0, 60, 20);</span></p> <p><span style="font-size: 10pt">    g.setFont(new Font("Times New Roman",Font.TRUETYPE_FONT,pSize));</span></p> <p><span style="font-size: 10pt">    g.setColor(getRandColor(200, 250));<br />     for (int i=0;i<18;i++) {<br />       int x = random.nextInt(60);<br />       int y = random.nextInt(20);<br />       int xl = random.nextInt(12);<br />       int yl = random.nextInt(12);<br />       g.drawLine(x,y,x+xl,y+yl);<br />     }</span></p> <p><span style="font-size: 10pt">    StringBuffer randCode = new StringBuffer();<br />     for (int i=0;i<4;i++){<br />       String temp = String.valueOf(random.nextInt(10));<br />       randCode.append(temp);<br />       g.setColor(new Color(0,0,0));<br />       g.drawString(temp,13*i+6,16);<br />     }<br />     session.setAttribute("randCode", randCode.toString());</span></p> <p><span style="font-size: 10pt">    g.dispose();<br />     ImageIO.write(image, "jpg", out);<br />   }</span></p> <p><br /> <span style="font-size: 10pt">  public static void outputImage(String sessionName, HttpSession session, HttpServletResponse response) throws IOException{</span></p> <p><span style="font-size: 10pt">    BufferedImage image = new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);<br />     Graphics g = image.getGraphics();</span></p> <p><span style="font-size: 10pt">    g.setColor(getRandColor(200, 250));<br />     g.fillRect(0, 0, 60, 20);</span></p> <p><span style="font-size: 10pt">    g.setFont(new Font("Times New Roman",Font.PLAIN,18));</span></p> <p><span style="font-size: 10pt">    g.setColor(getRandColor(160, 200));<br />     for (int i=0;i<155;i++) {<br />       int x = random.nextInt(60);<br />       int y = random.nextInt(20);<br />       int xl = random.nextInt(12);<br />       int yl = random.nextInt(12);<br />       g.drawLine(x,y,x+xl,y+yl);<br />     }</span></p> <p><span style="font-size: 10pt">    StringBuffer randCode = new StringBuffer();<br />     for (int i=0;i<4;i++){<br />       String temp = String.valueOf(random.nextInt(10));<br />       randCode.append(temp);<br />       g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));<br />       g.drawString(temp,13*i+6,16);<br />     }<br />     session.setAttribute(sessionName, randCode.toString());<br />     g.dispose();<br />     response.reset();<br />     OutputStream out=response.getOutputStream();<br />     ImageIO.write(image, "JPEG", out);</span></p> <p><span style="font-size: 10pt">    out.flush();<br />     out.close();<br />   }<br /> }</span></p> <img src ="http://m.tkk7.com/lcs868/aggbug/246654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lcs868/" target="_blank">李春?/a> 2008-12-16 16:17 <a href="http://m.tkk7.com/lcs868/archive/2008/12/16/246654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring cron表达?/title><link>http://m.tkk7.com/lcs868/articles/246649.html</link><dc:creator>李春?/dc:creator><author>李春?/author><pubDate>Tue, 16 Dec 2008 08:06:00 GMT</pubDate><guid>http://m.tkk7.com/lcs868/articles/246649.html</guid><wfw:comment>http://m.tkk7.com/lcs868/comments/246649.html</wfw:comment><comments>http://m.tkk7.com/lcs868/articles/246649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lcs868/comments/commentRss/246649.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lcs868/services/trackbacks/246649.html</trackback:ping><description><![CDATA[<br /> <p><span style="font-size: 10pt">Cron表达式是一个字W串Q字W串??个空格隔开Q分开??个域Q每一个域代表一个含?Cron有如下两U语?<br /> 格式Q?<br /> Seconds Minutes Hours DayofMonth Month DayofWeek Year ?<br /> Seconds Minutes Hours DayofMonth Month DayofWeek <br /> 每一个域可出现的字符如下Q?</span></p> <p><br /> <span style="font-size: 10pt">代码<br /> Seconds:可出?-  *  / 四个字符Q有效范围ؓ(f)0-59的整?nbsp;   <br /> Minutes:可出?-  *  / 四个字符Q有效范围ؓ(f)0-59的整?nbsp;   <br /> Hours:可出?-  *  / 四个字符Q有效范围ؓ(f)0-23的整?nbsp;   <br /> DayofMonth:可出?-  *  / ? L W C八个字符Q有效范围ؓ(f)0-31的整?nbsp;    <br /> Month:可出?-  *  / 四个字符Q有效范围ؓ(f)1-12的整数或JAN-DEc    <br /> DayofWeek:可出?-  *  / ? L C #四个字符Q有效范围ؓ(f)1-7的整数或SUN-SAT两个范围?表示星期天,2表示星期一Q?依次cL    <br /> Year:可出?-  *  / 四个字符Q有效范围ؓ(f)1970-2099q?nbsp;  <br />  </span></p> <p><span style="font-size: 10pt">每一个域都用数字,但还可以出现如下Ҏ(gu)字符Q它们的含义是:(x) </span></p> <p><br /> <span style="font-size: 10pt">代码<br /> (1)*Q表C匹配该域的L|假如在Minutes域?,卌C每分钟都会(x)触发事g?nbsp;   <br />    <br /> (2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的Q意|但实际不?x)。因为DayofMonth和DayofWeek?x)相互媄响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能用如下写法:(x) 13  13 15 20 * ?,其中最后一位只能用Q,而不能?Q如果?表示不管星期几都?x)触发,实际上ƈ不是q样?nbsp;   <br />    <br /> (3)-:表示范围Q例如在Minutes域?-20Q表CZ5分到20分钟每分钟触发一?nbsp;   <br />    <br /> (4)/Q表Cv始时间开始触发,然后每隔固定旉触发一ơ,例如在Minutes域?/20,则意味着5分钟触发一ơ,?5Q?5{分别触发一?    <br />    <br /> (5),:表示列出枚D值倹{例如:(x)在Minutes域?,20Q则意味着??0分每分钟触发一ơ?nbsp;   <br />    <br /> (6)L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域?L,意味着在最后的一个星期四触发?nbsp;   <br />    <br /> (7)W:表示有效工作?周一到周?,只能出现在DayofMonth域,pȝ在L定日期的最q的有效工作日触发事件。例如:(x)在DayofMonth使用5WQ如?日是星期六,则将在最q的工作日:(x)星期五,?日触发。如?日是星期天,则在6日触发;如果5日在星期一到星期五中的一天,则就?日触发。另外一点,W(xu)的最q寻找不?x)跨q月?nbsp;   <br />    <br /> (8)LW:q两个字W可以连用,表示在某个月最后一个工作日Q即最后一个星期五?nbsp;   <br />    <br /> (9)#:用于定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2Q表C某月的W二个星期三?nbsp;   <br /> 丑և个例? </span></p> <p><br /> <span style="font-size: 10pt">代码<br /> 0 0  2  1 *  ? *  表示在每月的1日的凌晨2点调度Q?nbsp;    <br /> 0 15 10 ? *  MON-FRI 表示周一到周五每天上?0Q?5执行作业             <br /> 0 15 10 ? 6L 2002-2006 表示200-2006q的每个月的最后一个星期五上午10:15执行作业   <br /> 91linux </span></p> <p><br /> <span style="font-size: 10pt">一个cron表达式有臛_6个(也可?个)有空格分隔的旉元素?/span></p> <p><span style="font-size: 10pt">按顺序依ơؓ(f) <br /> U(0~59Q?<br /> 分钟Q?~59Q?</span></p> <p><span style="font-size: 10pt">时Q?~23Q?</span></p> <p><span style="font-size: 10pt">天(月)Q?~31Q但是你需要考虑你月的天敎ͼ </span></p> <p><span style="font-size: 10pt">月(0~11Q?</span></p> <p><span style="font-size: 10pt">天(星期Q(1~7 1=SUN ?SUNQMONQTUEQW(xu)EDQTHUQFRIQSATQ?</span></p> <p><span style="font-size: 10pt">7.q䆾Q?970Q?099Q?/span></p> <p><span style="font-size: 10pt">其中每个元素可以是一个??),一个连l区?9-12),一个间隔时?8-18/4)(/表示每隔4时),一个列?1,3,5),通配W。由?月䆾中的日期"?星期中的日期"q两个元素互斥的,必须要对其中一个设|?. </span></p> <p><span style="font-size: 10pt">0 0 10,14,16 * * ? 每天上午10点,下午2点,4?br /> 0 0/30 9-17 * * ?   朝九(ji)晚五工作旉内每半小?br /> 0 0 12 ? * WED 表示每个星期三中?2?<br /> "0 0 12 * * ?" 每天中午12点触?<br /> "0 15 10 ? * *" 每天上午10:15触发 <br /> "0 15 10 * * ?" 每天上午10:15触发 <br /> "0 15 10 * * ? *" 每天上午10:15触发 <br /> "0 15 10 * * ? 2005" 2005q的每天上午10:15触发 <br /> "0 * 14 * * ?" 在每天下?点到下午2:59期间的每1分钟触发 <br /> "0 0/5 14 * * ?" 在每天下?点到下午2:55期间的每5分钟触发 <br /> "0 0/5 14,18 * * ?" 在每天下?点到2:55期间和下?点到6:55期间的每5分钟触发 <br /> "0 0-5 14 * * ?" 在每天下?点到下午2:05期间的每1分钟触发 <br /> "0 10,44 14 ? 3 WED" 每年三月的星期三的下?:10?:44触发 <br /> "0 15 10 ? * MON-FRI" 周一臛_五的上午10:15触发 <br /> "0 15 10 15 * ?" 每月15日上?0:15触发 <br /> "0 15 10 L * ?" 每月最后一日的上午10:15触发 <br /> "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 <br /> "0 15 10 ? * 6L 2002-2005" 2002q至2005q的每月的最后一个星期五上午10:15触发 <br /> "0 15 10 ? * 6#3" 每月的第三个星期五上?0:15触发 </span></p> <p><br /> <span style="font-size: 10pt">有些子表辑ּ能包含一些范围或列表 </span></p> <p><span style="font-size: 10pt">例如Q子表达式(天(星期Q)可以?“MON-FRI”Q?#8220;MONQW(xu)EDQFRI”Q?#8220;MON-WED,SAT” </span></p> <p><span style="font-size: 10pt">“*”字符代表所有可能的?</span></p> <p><span style="font-size: 10pt">因此Q?#8220;*”在子表达式(月)里表C每个月的含义,“*”在子表达式(天(星期Q)表示星期的每一?</span></p> <p><span style="font-size: 10pt"> </span></p> <p><span style="font-size: 10pt">“/”字符用来指定数值的增量 </span></p> <p><span style="font-size: 10pt">例如Q在子表辑ּQ分钟)里的“0/15”表示从第0分钟开始,?5分钟 </span></p> <p><span style="font-size: 10pt">         在子表达式(分钟Q里?#8220;3/20”表示从第3分钟开始,?0分钟Q它?#8220;3Q?3Q?3”Q的含义一?</span></p> <p><br /> <span style="font-size: 10pt">“Q?#8221;字符仅被用于天(月)和天Q星期)两个子表辑ּQ表CZ指定?</span></p> <p><span style="font-size: 10pt">?个子表达式其中之一被指定了g后,Z避免冲突Q需要将另一个子表达式的D?#8220;Q?#8221; </span></p> <p><span style="font-size: 10pt"> </span></p> <p><span style="font-size: 10pt">“L” 字符仅被用于天(月)和天Q星期)两个子表辑ּQ它是单?#8220;last”的羃?</span></p> <p><span style="font-size: 10pt">但是它在两个子表辑ּ里的含义是不同的?</span></p> <p><span style="font-size: 10pt">在天Q月Q子表达式中Q?#8220;L”表示一个月的最后一?</span></p> <p><span style="font-size: 10pt">在天Q星期)自表辑ּ中,“L”表示一个星期的最后一天,也就是SAT </span></p> <p><span style="font-size: 10pt">如果?#8220;L”前有具体的内容,它就h其他的含义了 </span></p> <p><span style="font-size: 10pt">例如Q?#8220;6L”表示q个月的倒数W6天,“QRQL”表示q个月的最一个星期五 </span></p> <p><span style="font-size: 10pt">注意Q在使用“L”参数Ӟ不要指定列表或范_(d)因ؓ(f)q会(x)D问题 </span></p> <p><span style="font-size: 10pt"> </span></p> <p><span style="font-size: 10pt">字段   允许?nbsp;  允许的特D字W?<br /> U?nbsp;   0-59    , - * / <br /> ?nbsp;   0-59    , - * / <br /> 时    0-23    , - * / <br /> 日期    1-31    , - * ? / L W C <br /> 月䆾    1-12 或?JAN-DEC    , - * / <br /> 星期    1-7 或?SUN-SAT    , - * ? / L C # <br /> q_(d)可选)    留空, 1970-2099    , - * / </span></p> <img src ="http://m.tkk7.com/lcs868/aggbug/246649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lcs868/" target="_blank">李春?/a> 2008-12-16 16:06 <a href="http://m.tkk7.com/lcs868/articles/246649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java实现ip查询http://m.tkk7.com/lcs868/archive/2008/12/16/246644.html李春?/dc:creator>李春?/author>Tue, 16 Dec 2008 07:56:00 GMThttp://m.tkk7.com/lcs868/archive/2008/12/16/246644.htmlhttp://m.tkk7.com/lcs868/comments/246644.htmlhttp://m.tkk7.com/lcs868/archive/2008/12/16/246644.html#Feedback7http://m.tkk7.com/lcs868/comments/commentRss/246644.htmlhttp://m.tkk7.com/lcs868/services/trackbacks/246644.html 用java实现对纯真IP数据库的查询Q首先到|上下蝲QQwry.da文gQ读取代码如下:(x)
1.IP记录实体c?br />

package com.guess.tools;

/** *
* 一条IP范围记录Q不仅包括国家和区域Q也包括起始IP和结束IP *

 *
 * @author swallow */
public class IPEntry {
    public String beginIp;
    public String endIp;
    public String country;
    public String area;
   
    /** *//**
     * 构造函?br />      */
  
 

 public IPEntry() {
        beginIp = endIp = country = area = "";
    }
   
    public String toString(){
       return        this.area+"  "+this.country+"IP范围:"+this.beginIp+"-"+this.endIp;
    }
   }
2.dQQwry.dat文gc?/span>

package com.guess.tools;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteOrder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

 


/** *//**
 *  * 用来dQQwry.dat文gQ以Ҏ(gu)ip获得好友位置QQQwry.dat的格式是
 * 一. 文g_(d)?字节
 *        1. W一个v始IP的绝对偏U, 4字节
 *     2. 最后一个v始IP的绝对偏U, 4字节
 * ? "l束地址/国家/区域"记录?br />  *     四字节ip地址后跟的每一条记录分成两个部?br />  *     1. 国家记录
 *     2. 地区记录
 *     但是地区记录是不一定有的。而且国家记录和地录都有两UŞ?br />  *     1. ?l束的字W串
 *     2. 4个字节,一个字节可能ؓ(f)0x1?x2
 *           a. ?x1Ӟ表示在绝对偏Udq跟着一个区域的记录Q注意是l对偏移之后Q而不是这四个字节之后
 *        b. ?x2Ӟ表示在绝对偏Ud没有区域记录
 *        不管?x1q是0x2Q后三个字节都是实际国家名的文g内绝对偏U?br />  *           如果是地录,0x1?x2的含义不明,但是如果出现q两个字节,也肯定是跟着3个字节偏U,如果不是
 *        则ؓ(f)0l尾字符?br />  * ? "起始地址/l束地址偏移"记录?br />  *     1. 每条记录7字节Q按照v始地址从小到大排列
 *        a. 起始IP地址Q?字节
 *        b. l束ip地址的绝对偏U,3字节
 *
 * 注意Q这个文仉的ip地址和所有的偏移量均采用little-endian格式Q而java是采?br />  * big-endian格式的,要注意{?br />  *
 *
 * @author 马若?br />  */
public class IPSeeker {
    /** *//**
     *      * 用来装ip相关信息Q目前只有两个字D,ip所在的国家和地?br />      *
     *
     * @author swallow     */
    private class IPLocation {
        public String country;
        public String area;

        public IPLocation() {
            country = area = "";
        }

        public IPLocation getCopy() {
            IPLocation ret = new IPLocation();
            ret.country = country;
            ret.area = area;
            return ret;
        }
    }

    private static final String IP_FILE = IPSeeker.class.getResource("/QQWry.DAT").toString().substring(5);

    // 一些固定常量,比如记录长度{等
    private static final int IP_RECORD_LENGTH = 7;
    private static final byte AREA_FOLLOWED = 0x01;
    private static final byte NO_AREA = 0x2;

     // 用来做ؓ(f)cacheQ查询一个ip旉先查看cacheQ以减少不必要的重复查找
    private Hashtable ipCache;
    // 随机文g讉Kc?br />     private RandomAccessFile ipFile;
    // 内存映射文g
    private MappedByteBuffer mbb;
    // 单一模式实例
    private static IPSeeker instance = new IPSeeker();
    // 起始地区的开始和l束的绝对偏U?br />     private long ipBegin, ipEnd;
    // 为提高效率而采用的临时变量
    private IPLocation loc;
    private byte[] buf;
    private byte[] b4;
    private byte[] b3;

    /** *//**
     * U有构造函?br />      */
    private IPSeeker()  {
        ipCache = new Hashtable();
        loc = new IPLocation();
        buf = new byte[100];
        b4 = new byte[4];
        b3 = new byte[3];
        try {
            ipFile = new RandomAccessFile(IP_FILE, "r");
        } catch (FileNotFoundException e) {
                        System.out.println(IPSeeker.class.getResource("/QQWry.DAT").toString());
                        System.out.println(IP_FILE);
            System.out.println("IP地址信息文g没有扑ֈQIP昄功能无法?);
            ipFile = null;

        }
        // 如果打开文g成功Q读取文件头信息
        if(ipFile != null) {
            try {
                ipBegin = readLong4(0);
                ipEnd = readLong4(4);
                if(ipBegin == -1 || ipEnd == -1) {
                    ipFile.close();
                    ipFile = null;
                }
            } catch (IOException e) {
                System.out.println("IP地址信息文g格式有错误,IP昄功能无法?);
                ipFile = null;
            }
        }
    }

    /** *//**
     * @return 单一实例
     */
    public static IPSeeker getInstance() {
        return instance;
    }

    /** *//**
     * l定一个地点的不完全名字,得到一pd包含s子串的IP范围记录
     * @param s 地点子串
     * @return 包含I(xin)PEntrycd的List
     */
    public List getIPEntriesDebug(String s) {
        List ret = new ArrayList();
        long endOffset = ipEnd + 4;
        for(long offset = ipBegin + 4; offset <= endOffset; offset += IP_RECORD_LENGTH) {
            // dl束IP偏移
            long temp = readLong3(offset);
            // 如果temp不等?1Q读取IP的地点信?br />             if(temp != -1) {
                IPLocation loc = getIPLocation(temp);
                // 判断是否q个地点里面包含了s子串Q如果包含了Q添加这个记录到List中,如果没有Ql?br />                 if(loc.country.indexOf(s) != -1 || loc.area.indexOf(s) != -1) {
                    IPEntry entry = new IPEntry();
                    entry.country = loc.country;
                    entry.area = loc.area;
                    // 得到起始IP
                    readIP(offset - 4, b4);
                    entry.beginIp = Utils.getIpStringFromBytes(b4);
                    // 得到l束IP
                    readIP(temp, b4);
                    entry.endIp = Utils.getIpStringFromBytes(b4);
                    // d该记?br />                     ret.add(entry);
                }
            }
        }
        return ret;
    }

    /** *//**
     * l定一个地点的不完全名字,得到一pd包含s子串的IP范围记录
     * @param s 地点子串
     * @return 包含I(xin)PEntrycd的List
     */
    public List getIPEntries(String s) {
        List ret = new ArrayList();
        try {
            // 映射IP信息文g到内存中
            if(mbb == null) {
                FileChannel fc = ipFile.getChannel();
                mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, ipFile.length());
                mbb.order(ByteOrder.LITTLE_ENDIAN);
            }

            int endOffset = (int)ipEnd;
            for(int offset = (int)ipBegin + 4; offset <= endOffset; offset += IP_RECORD_LENGTH) {
                int temp = readInt3(offset);
                if(temp != -1) {
                    IPLocation loc = getIPLocation(temp);
                    // 判断是否q个地点里面包含了s子串Q如果包含了Q添加这个记录到List中,如果没有Ql?br />                     if(loc.country.indexOf(s) != -1 || loc.area.indexOf(s) != -1) {
                        IPEntry entry = new IPEntry();
                        entry.country = loc.country;
                        entry.area = loc.area;
                        // 得到起始IP
                        readIP(offset - 4, b4);
                        entry.beginIp = Utils.getIpStringFromBytes(b4);
                        // 得到l束IP
                        readIP(temp, b4);
                        entry.endIp = Utils.getIpStringFromBytes(b4);
                        // d该记?br />                         ret.add(entry);
                    }
                }
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        return ret;
    }

    /** *//**
     * 从内存映文件的offset位置开始的3个字节读取一个int
     * @param offset
     * @return
     */
    private int readInt3(int offset) {
        mbb.position(offset);
        return mbb.getInt() & 0x00FFFFFF;
    }

    /** *//**
     * 从内存映文件的当前位置开始的3个字节读取一个int
     * @return
     */
    private int readInt3() {
        return mbb.getInt() & 0x00FFFFFF;
    }

    /** *//**
     * Ҏ(gu)IP得到国家?br />      * @param ip ip的字节数lŞ?br />      * @return 国家名字W串
     */
    public String getCountry(byte[] ip) {
        // 查ip地址文g是否正常
        if(ipFile == null) return "错误的IP数据库文?;
        // 保存ipQ{换ip字节数组为字W串形式
        String ipStr = Utils.getIpStringFromBytes(ip);
        // 先检查cache中是否已l包含有q个ip的结果,没有再搜索文?br />         if(ipCache.containsKey(ipStr)) {
            IPLocation loc = (IPLocation)ipCache.get(ipStr);
            return loc.country;
        } else {
            IPLocation loc = getIPLocation(ip);
            ipCache.put(ipStr, loc.getCopy());
            return loc.country;
        }
    }

    /** *//**
     * Ҏ(gu)IP得到国家?br />      * @param ip IP的字W串形式
     * @return 国家名字W串
     */
    public String getCountry(String ip) {
        return getCountry(Utils.getIpByteArrayFromString(ip));
    }

    /** *//**
     * Ҏ(gu)IP得到地区?br />      * @param ip ip的字节数lŞ?br />      * @return 地区名字W串
     */
    public String getArea(byte[] ip) {
        // 查ip地址文g是否正常
        if(ipFile == null) return "错误的IP数据库文?;
        // 保存ipQ{换ip字节数组为字W串形式
        String ipStr = Utils.getIpStringFromBytes(ip);
        // 先检查cache中是否已l包含有q个ip的结果,没有再搜索文?br />         if(ipCache.containsKey(ipStr)) {
            IPLocation loc = (IPLocation)ipCache.get(ipStr);
            return loc.area;
        } else {
            IPLocation loc = getIPLocation(ip);
            ipCache.put(ipStr, loc.getCopy());
            return loc.area;
        }
    }

    /** *//**
     * Ҏ(gu)IP得到地区?br />      * @param ip IP的字W串形式
     * @return 地区名字W串
     */
    public String getArea(String ip) {
        return getArea(Utils.getIpByteArrayFromString(ip));
    }

    /** *//**
     * Ҏ(gu)ip搜烦ip信息文gQ得到IPLocationl构Q所搜烦的ip参数从类成员ip中得?br />      * @param ip 要查询的IP
     * @return IPLocationl构
     */
    private IPLocation getIPLocation(byte[] ip) {
        IPLocation info = null;
        long offset = locateIP(ip);
        if(offset != -1)
            info = getIPLocation(offset);
        if(info == null) {
            info = new IPLocation();
            info.country = "未知国家";
            info.area = "未知地区";
        }
        return info;
    }

    /** *//**
     * 从offset位置d4个字节ؓ(f)一个longQ因为java为big-endian格式Q所以没办法
     * 用了q么一个函数来做{?br />      * @param offset
     * @return d的long|q回-1表示d文gp|
     */
    private long readLong4(long offset) {
        long ret = 0;
        try {
            ipFile.seek(offset);
            ret |= (ipFile.readByte() & 0xFF);
            ret |= ((ipFile.readByte() << 8) & 0xFF00);
            ret |= ((ipFile.readByte() << 16) & 0xFF0000);
            ret |= ((ipFile.readByte() << 24) & 0xFF000000);
            return ret;
        } catch (IOException e) {
            return -1;
        }
    }

    /** *//**
     * 从offset位置d3个字节ؓ(f)一个longQ因为java为big-endian格式Q所以没办法
     * 用了q么一个函数来做{?br />      * @param offset
     * @return d的long|q回-1表示d文gp|
     */
    private long readLong3(long offset) {
        long ret = 0;
        try {
            ipFile.seek(offset);
            ipFile.readFully(b3);
            ret |= (b3[0] & 0xFF);
            ret |= ((b3[1] << 8) & 0xFF00);
            ret |= ((b3[2] << 16) & 0xFF0000);
            return ret;
        } catch (IOException e) {
            return -1;
        }
    }

    /** *//**
     * 从当前位|读?个字节{换成long
     * @return
     */
    private long readLong3() {
        long ret = 0;
        try {
            ipFile.readFully(b3);
            ret |= (b3[0] & 0xFF);
            ret |= ((b3[1] << 8) & 0xFF00);
            ret |= ((b3[2] << 16) & 0xFF0000);
            return ret;
        } catch (IOException e) {
            return -1;
        }
    }

    /** *//**
     * 从offset位置d四个字节的ip地址攑օip数组中,d后的ip为big-endian格式Q但?br />      * 文g中是little-endian形式Q将?x)进行{?br />      * @param offset
     * @param ip
     */
    private void readIP(long offset, byte[] ip) {
        try {
            ipFile.seek(offset);
            ipFile.readFully(ip);
            byte temp = ip[0];
            ip[0] = ip[3];
            ip[3] = temp;
            temp = ip[1];
            ip[1] = ip[2];
            ip[2] = temp;
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    /** *//**
     * 从offset位置d四个字节的ip地址攑օip数组中,d后的ip为big-endian格式Q但?br />      * 文g中是little-endian形式Q将?x)进行{?br />      * @param offset
     * @param ip
     */
    private void readIP(int offset, byte[] ip) {
        mbb.position(offset);
        mbb.get(ip);
        byte temp = ip[0];
        ip[0] = ip[3];
        ip[3] = temp;
        temp = ip[1];
        ip[1] = ip[2];
        ip[2] = temp;
    }

    /** *//**
     * 把类成员ip和beginIp比较Q注意这个beginIp是big-endian?br />      * @param ip 要查询的IP
     * @param beginIp 和被查询IP相比较的IP
     * @return 相等q回0Qip大于beginIp则返?Q小于返?1?br />      */
    private int compareIP(byte[] ip, byte[] beginIp) {
        for(int i = 0; i < 4; i++) {
            int r = compareByte(ip[i], beginIp[i]);
            if(r != 0)
                return r;
        }
        return 0;
    }

    /** *//**
     * 把两个byte当作无符hq行比较
     * @param b1
     * @param b2
     * @return 若b1大于b2则返?Q相{返?Q小于返?1
     */
    private int compareByte(byte b1, byte b2) {
        if((b1 & 0xFF) > (b2 & 0xFF)) // 比较是否大于
            return 1;
        else if((b1 ^ b2) == 0)// 判断是否相等
            return 0;
        else
            return -1;
    }

    /** *//**
     * q个Ҏ(gu)根据ip的内容,定位到包含这个ip国家地区的记录处Q返回一个绝对偏U?br />      * Ҏ(gu)使用二分法查找?br />      * @param ip 要查询的IP
     * @return 如果扑ֈ了,q回l束IP的偏U,如果没有扑ֈQ返?1
     */
    private long locateIP(byte[] ip) {
        long m = 0;
        int r;
        // 比较W一个ip?br />         readIP(ipBegin, b4);
        r = compareIP(ip, b4);
        if(r == 0) return ipBegin;
        else if(r < 0) return -1;
        // 开始二分搜?br />         for(long i = ipBegin, j = ipEnd; i < j; ) {
            m = getMiddleOffset(i, j);
            readIP(m, b4);
            r = compareIP(ip, b4);
            // log.debug(Utils.getIpStringFromBytes(b));
            if(r > 0)
                i = m;
            else if(r < 0) {
                if(m == j) {
                    j -= IP_RECORD_LENGTH;
                    m = j;
                } else
                    j = m;
            } else
                return readLong3(m + 4);
        }
        // 如果循环l束了,那么i和j必定是相{的Q这个记录ؓ(f)最可能的记录,但是q
        //     肯定是Q还要检查一下,如果是,p回结束地址区的l对偏移
        m = readLong3(m + 4);
        readIP(m, b4);
        r = compareIP(ip, b4);
        if(r <= 0) return m;
        else return -1;
    }

    /** *//**
     * 得到begin偏移和end偏移中间位置记录的偏U?br />      * @param begin
     * @param end
     * @return
     */
    private long getMiddleOffset(long begin, long end) {
        long records = (end - begin) / IP_RECORD_LENGTH;
        records >>= 1;
        if(records == 0) records = 1;
        return begin + records * IP_RECORD_LENGTH;
    }

    /** *//**
     * l定一个ip国家地区记录的偏U,q回一个IPLocationl构
     * @param offset
     * @return
     */
    private IPLocation getIPLocation(long offset) {
        try {
            // 跌4字节ip
            ipFile.seek(offset + 4);
            // dW一个字节判断是否标志字?br />             byte b = ipFile.readByte();
            if(b == AREA_FOLLOWED) {
                // d国家偏移
                long countryOffset = readLong3();
                // 跌{臛_Ud
                ipFile.seek(countryOffset);
                // 再检查一ơ标志字节,因ؓ(f)q个时候这个地方仍然可能是个重定向
                b = ipFile.readByte();
                if(b == NO_AREA) {
                    loc.country = readString(readLong3());
                    ipFile.seek(countryOffset + 4);
                } else
                    loc.country = readString(countryOffset);
                // d地区标志
                loc.area = readArea(ipFile.getFilePointer());
            } else if(b == NO_AREA) {
                loc.country = readString(readLong3());
                loc.area = readArea(offset + 8);
            } else {
                loc.country = readString(ipFile.getFilePointer() - 1);
                loc.area = readArea(ipFile.getFilePointer());
            }
            return loc;
        } catch (IOException e) {
            return null;
        }
    }

    /** *//**
     * @param offset
     * @return
     */
    private IPLocation getIPLocation(int offset) {
        // 跌4字节ip
        mbb.position(offset + 4);
        // dW一个字节判断是否标志字?br />         byte b = mbb.get();
        if(b == AREA_FOLLOWED) {
            // d国家偏移
            int countryOffset = readInt3();
            // 跌{臛_Ud
            mbb.position(countryOffset);
            // 再检查一ơ标志字节,因ؓ(f)q个时候这个地方仍然可能是个重定向
            b = mbb.get();
            if(b == NO_AREA) {
                loc.country = readString(readInt3());
                mbb.position(countryOffset + 4);
            } else
                loc.country = readString(countryOffset);
            // d地区标志
            loc.area = readArea(mbb.position());
        } else if(b == NO_AREA) {
            loc.country = readString(readInt3());
            loc.area = readArea(offset + 8);
        } else {
            loc.country = readString(mbb.position() - 1);
            loc.area = readArea(mbb.position());
        }
        return loc;
    }

    /** *//**
     * 从offset偏移开始解析后面的字节Q读Z个地区名
     * @param offset
     * @return 地区名字W串
     * @throws IOException
     */
    private String readArea(long offset) throws IOException {
        ipFile.seek(offset);
        byte b = ipFile.readByte();
        if(b == 0x01 || b == 0x02) {
            long areaOffset = readLong3(offset + 1);
            if(areaOffset == 0)
                return "未知地区";
            else
                return readString(areaOffset);
        } else
            return readString(offset);
    }

    /** *//**
     * @param offset
     * @return
     */
    private String readArea(int offset) {
        mbb.position(offset);
        byte b = mbb.get();
        if(b == 0x01 || b == 0x02) {
            int areaOffset = readInt3();
            if(areaOffset == 0)
                return "未知地区";
            else
                return readString(areaOffset);
        } else
            return readString(offset);
    }

    /** *//**
     * 从offset偏移处读取一个以0l束的字W串
     * @param offset
     * @return d的字W串Q出错返回空字符?br />      */
    private String readString(long offset) {
        try {
            ipFile.seek(offset);
            int i;
            for(i = 0, buf[i] = ipFile.readByte(); buf[i] != 0; buf[++i] = ipFile.readByte());
            if(i != 0)
                return Utils.getString(buf, 0, i, "GBK");
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        return "";
    }

    /** *//**
     * 从内存映文件的offset位置得到一?l尾字符?br />      * @param offset
     * @return
     */
    private String readString(int offset) {
        try {
            mbb.position(offset);
            int i;
            for(i = 0, buf[i] = mbb.get(); buf[i] != 0; buf[++i] = mbb.get());
            if(i != 0)
                return Utils.getString(buf, 0, i, "GBK");
        } catch (IllegalArgumentException e){
         System.out.println(e.getMessage());
        }
        return "";
    }

    public String getAddress(String ip){
        String country = getCountry(ip).equals(" CZ88.NET")?"":getCountry(ip);
        String area = getArea(ip).equals(" CZ88.NET")?"":getArea(ip);
        String address = country+" "+area;
        return address.trim();
    }
    public static void main(String args[]) {
     List list=IPSeeker.getInstance().getIPEntriesDebug("江省杭州市");
     
     
     
    }
}

 



]]>
վ֩ģ壺 ŮƵվm| ˬִ̼߳Ƶ| ڵaëƬѿ| һƵѹۿ| 97ƵѹƵ| ձѾþþþþþվ| 1000ڵƵۿ| ѹƵվ| СƵ| ޾ƷWWWþþþþ| þù޵Ӱ| ޹˾Ʒԭ| ޵һ͵Ľ| ҰƵ߹1| ȫ߹ۿ| vƬѹۿƵ| ޹ƷۺϾþһ | ޾Ʒһ| ĻþþƷ2021| ҹƬAVƬ| ɫƵ߹ۿ| 91µַ| Ƶ77777| ޹Ʒľþþ| avavav߲ | һ| ޾Ʒþ| һƬѿ| ߶| ޾Ʒר2| ޳77777| ѹݮƵ߹ۿ| 99Ƶ99߹ۿ | ޳ַ| һƵ| þþ뾫Ʒպ˳| ۺa| þþƷר| ѳ˻ɫƬ| ˳77777վ| ߲ŹƵ|