以下是小编整理的Windows NT/操作系统认证方法数据库教程(共含10篇),欢迎阅读分享,希望对大家有帮助。同时,但愿您也能像本文投稿人“全家”一样,积极向本站投稿分享好文章。
window
remote_login_passwordfile:
说明: 指定操作系统或一个文件是否检查具有权限的用户的口令,如果设置为 NONE, Oracle 将忽略口令文件。如果设置为
EXCLUSIVE, 将使用数据库的口令文件对每个具有权限的用户进行验证。如果设置为 SHARED, 多个数据库将共享
SYS 和 INTERNAL 口令文件用户。
值范围:NONE | SHARED | EXCLUSIVE
默认值: NONE
##############################
sqlnet.ora
# SQLNET.ORA Network Configuration File:
D:\oracle\ora90\NETWORK\ADMIN qlnet.ora
# Generated by Oracle configuration tools.
NAMES.DEFAULT_DOMAIN = nova.net
SQLNET.AUTHENTICATION_SERVICES=(NTS) / authentication 证明
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)
数据|数据库|压缩
MDB数据库压缩方法
jimzj@21cn.com
虽然说MDB数据库功能不是很强大,但时由于在WIN x系统中已有缺省的驱动程序,所以不用另外像SQL,SYBASE一样安装一个管理驱动,而且携带方便,很多的小应用程序或网站还是采用MDB数据库,经常操作MDB数据时,就会经常碰到要对数据进行压缩,下面的我在网上找到和自己使用的经验写一下关于在各种环境中压缩MDB数据库的方法,提供大家参考:
一、ASP或VB中压缩
以前使用 DAO 时,Microsoft 有提供 CompactDatabase Method 来压缩 Microsoft Access 资料库,RepairDatabase Method 来修复损毁的 Microsoft Access 资料库。可是自从 ADO 出来之后,也提供了解决方法,不过有版本上的限制!限制说明如下:
ActiveX Data Objects (ADO), version 2.1
Microsoft OLE DB Provider for Jet, version 4.0
这是 Microsoft 提出的 ADO 的延伸功能:Microsoft Jet OLE DB Provider and Replication Objects (JRO)这个功能在 JET OLE DB Provider version 4.0 (Msjetoledb40.dll) 及 JRO version 2.1 (Msjro.dll) 中第一次被提出!这些必要的 DLL 文件在您安装了 MDAC 2.1 之后就有了,您可以在以下的网页中下载 MDAC 的最新版本!Universal Data Access Web Site在下载之前先到 VB6 中检查一下,【工程】【设定引用项目】中的 Microsoft Jet and Replication Objects X.X library 如果已经是 2.1 以上的版本,您就可以不用下载了!在您安装了 MDAC 2.1 或以上的版本之后,您就可以使用 ADO 来压缩或修复 Microsoft Access 资料库,下面的步骤告诉您如何使用 CompactDatabase Method 来压缩 Microsoft Access 资料库:1、开启一个新工程,点选功能表中的【工程】【设定引用项目】。
2、加入 Microsoft Jet and Replication Objects X.X library,其中 ( X.X 大于或等于 2.1 )。
3、在适当的地方加入以下的程序码,记得要修改 data source 的内容及目地资料库的路径:
Dim jro As jro.JetEngine
Set jro = New jro.JetEngine
jro.CompactDatabase “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\nwind2.mdb”, _ '来源资料库
“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\abbc2.mdb;Jet OLEDB:Engine Type=4” '目的资料库
在 DAO 3.60 之后,RepairDatabase Method 已经无法使用了,以上的程序码显示了 ADO CompactDatabase Method 的用法,而它也取代了 DAO 3.5 时的 RepairDatabase method
二、DELPHI中压缩
const SConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;' +'Jet OLEDB:Database Password=%s;';
function GetTempPathFileName:string;
var
SPath,SFile:array [0..254] of char;
begin
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
result:=SFile;
DeleteFile(result);
end;
function CompactDatabase(AFileName,APassWord:string):boolean;
//压缩与修复数据库,覆盖源文件
var
STempFileName:string;
vJE:OleVariant;
begin
STempFileName:=GetTempPathFileName;
try
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
except
result:=false;
end;
end;
三、C++ Builder中压缩
C++ 中在网上并没有找到很好的方法,但是根据我原来所作的建立MDB数据库方法,也找到了一个相对实用的的压缩方法;
1、 建立MDB文件的函数
#include
bool CreateAccessFile( String stFileName )
{
if( FileExists( stFileName )) return true ;
Variant vCreateAccess;
Procedure PCreateAccess( “Create” );
PCreateAccess << “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” + stFileName ;
vCreateAccess = CreateOleObject( “ADOX.Catalog” );
vCreateAccess.Exec( PCreateAccess );
return ( FileExists( stFileName )) ;
}
//---------------------------------------------------------------------------
2、 由OLE想到的功能来实现压结合实际的功能
#include
void CompactDatabase( String stFileName )
{
Variant vCreateAccess;
Procedure PCreateAccess( “CompactDatabase” );
String stTempFile = “Temp.mdb” ;
if( FileExists(stTempFile)) DeleteFile(stTempFile) ;
PCreateAccess << “Provider=Microsoft.Jet.OLEDB.4.0;Data Source= ” + stFileName + “;” ; //如果有密码请加上后面这一句Jet OLEDB:Database Password=password;“ ;
PCreateAccess << ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ + stTempFile + ”;“ ; //如果有密码请加上后面这一句Jet OLEDB:Database Password=password;” ;
vCreateAccess = CreateOleObject( “JRO.JetEngine” );
vCreateAccess.Exec( PCreateAccess );
//代替原来的数据库
CopyFile(stTempFile.c_str(),stFileName.c_str(), (int)false ) ;
DeleteFile(stTempFile) ;
}
四、Vc中压缩
#import “C:\PROGRAM FILES\COMMON FILES ystem\ado\MSJRO.DLL” no_namespace Add the following (specifying your own source and destination database paths) to the .cpp file where you
want to compact the database:
try
{
IJetEnginePtr jet(__uuidof(JetEngine));
jet->CompactDatabase(
“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\nwind2.mdb”,
“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\abbc.mdb;” \
“Jet OLEDB:Engine Type=4”);
}
catch(_com_error &e)
{
::MessageBox(NULL, (LPCTSTR)e.Description( ), “”, MB_OK) ;
}
更具体的E文可以看微软的文章:
support.microsoft.com/default.aspx?scid=kb;EN-US;230496
1)进入var/lib/mysql
2)删除掉mysql文件
3)重新启动mysql ,到此密码已经清空
4)设置新的密码
echo “grant all on *.* to 'root'@'localhost' identified by 'newpass';” | mysql -uroot
echo “grant all on *.* to 'root'@'%' identified by 'newpass';” | mysql -uroot -pnewpass
分组|统计
原贴:community.csdn.net/Expert/topic/3739/3739565.xml?temp=.7632105
表中三个字段
|---------------------------------------------|
| 产品 数量 单价 |
|=============================================|
| A 3 20 |
| A 4 25 |
| A 2 30 |
| B 6 85 |
| B 3 96 |
|---------------------------------------------|
现在想得到以下结果:
产品 平均价
A ******
B ******
注意:一种商品一个平均价
平均数算法:
A的平均价数= (3 * 20)+ (4 * 25)+ (2 * 30)/(3+4+2),B的平均值也如A,
分组统计方法:用Group By数据库教程
,
求该SQL语句。
create table 表(产品 varchar(5),数量 int,单价 decimal(4,2))
insert 表 select 'A',3,20
union all select 'A',4,25
union all select 'A',2,30
union all select 'B',6,85
union all select 'B',3,96
select 产品,cast(sum(isnull(单价,0)*isnull(数量,0))/sum(数量) as decimal(4,2)) as '平均值' from 表 group by 产品
drop table 表
--结果:
(所影响的行数为 5 行)
产品 平均值
----- ------
A 24.44
B 88.67
(所影响的行数为 2 行)
server|sqlserver
如果是在同一个局域网内的数据库可以直接操作第二个步骤它会自动搜索到局域网内的所以sqlserver数据库
但是如果是在不同局域网内的数据库就需要通过ip来访问步骤如下:
1、点击开始 -- 程序 -- Microsoft SQL Server -- 客户端网络实用工具 -- 另名 -- 点击添加 --- 网络库选取TCP/IP;服务器别名:数据库服务器的IP;服务器名称:数据库服务器的IP;端口默认1433(查清远程的端口是什么!) -- 确定
2、点击开始 -- 程序 -- Microsoft SQL Server -- 企业管理器 -- Mouse点 Microsoft SQL Servers -- mouse右键点 Sql Server 组;点新的sql server 注册.... -- 下一步 -- 增加主机IP,下一步---选“系统管理员给我分配的SQL Server登录信息....”. ,
远程管理sqlserver的注册方法数据库教程
,
。。。。。
数据
1、在的你计算机上安装sql server数据库的软件(注意:相同版本的数据库系统)
2、点击开始 -- 程序 -- Microsoft SQL Server -- 客户端网络实用工具 -- 另名 -- 点击添加 --- 网络库选取TCP/IP;服务器别名:数据库服务器的IP;服务器名称:数据库服务器的IP;端口默认1433 -- 确定
3、点击开始 -- 程序 -- Microsoft SQL Server -- 企业管理器 -- Mouse点 Microsoft SQL Servers -- mouse右键点 Sql Server 组;点新的sql server 注册.... -- 下一步 -- 增加主机IP,下一步---选“系统管理员给我分配的SQL Server登录信息....”.
下一步 -- 登录名:用户名、密码:密码、下一步 -- ……
4、联接成功后;请您找到您的数据库;你就可管理你的数据库,
注:不要越权。一般情况下你是只能看到别的数据库的名称而没有管理权限
---------------------------------------------------------------------
一.设置客户端网络实用工具
点击“开始”-“程序”,在“Microsoft SQL Server”菜单中选择“客户端网络实用工具”,
在“别名”选项中点击“添加”。
在“服务器别名”中,填入您网站域名,在“网络库”区域中点击“TCP/IP”,在“连接参数”区域取消“动态决定端口”,指定“端口号”为2433。填写完毕后,点击“确定”按钮保存配置。
二.企业管理器的使用
点击“开始”-“程序”,在“Microsoft SQL Server”菜单中打开“企业管理器”。在企业管理器中,右键单击“SQL Server组”,选择“新建SQL Server注册”。
此时会出现SQL Server属性窗口,在“服务器”中填入您网站的域名,选择“使用SQL Server身份验证”,“登录名”和“密码”分别填入主机开通邮件中的用户名和密码,然后点击“确定”。
连接成功后,你会看到“SQL Server组”中多了一个名称为您网站域名的服务器。此时,您就可以像操作本地SQL数据库一样管理网站数据库了。
注意事项
如果连接的时候出现超时错误,更改超时时间即可,方法是点击“工具”-“选项”。
在属性窗口中选择“高级”选项卡,将“登录超时”的数值设置为0。
优化|语句
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法:1. /*+ALL_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.
例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
2. /*+FIRST_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
3. /*+CHOOSE*/
表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;
表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
4. /*+RULE*/
表明对语句块选择基于规则的优化方法.
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
5. /*+FULL(TABLE)*/
表明对表选择全局扫描的方法.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';
6. /*+ROWID(TABLE)*/
提示明确表明对指定表根据ROWID进行访问.
例如:
SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
AND EMP_NO='SCOTT';
7. /*+CLUSTER(TABLE)*/
提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效.
例如:
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
8. /*+INDEX(TABLE INDEX_NAME)*/
表明对表选择索引的扫描方法.
例如:
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';
9. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明对表选择索引升序的扫描方法.
例如:
SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';
10. /*+INDEX_COMBINE*/
为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的布尔组合方式.
例如:
SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
WHERE SAL<5000000 AND HIREDATE
11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
提示明确命令优化器使用索引作为访问路径.
例如:
SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
FROM BSEMPMS WHERE SAL<60000;
12. /*+INDEX_DESC(TABLE INDEX_NAME)*/
表明对表选择索引降序的扫描方法.
例如:
SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';
13. /*+INDEX_FFS(TABLE INDEX_NAME)*/
对指定的表执行快速全索引扫描,而不是全表扫描的办法.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';
14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/
提示明确进行执行规划的选择,将几个单列索引的扫描合起来.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306';
15. /*+USE_CONCAT*/
对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询.
例如:
SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
16. /*+NO_EXPAND*/
对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展.
例如:
SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
17. /*+NOWRITE*/
禁止对查询块的查询重写操作.
18. /*+REWRITE*/
可以将视图作为参数.
19. /*+MERGE(TABLE)*/
能够对视图的各个查询进行相应的合并.
例如:
SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
AND A.SAL>V.AVG_SAL;
20. /*+NO_MERGE(TABLE)*/
对于有可合并的视图不再合并.
例如:
SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;
21. /*+ORDERED*/
根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接.
例如:
SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;
22. /*+USE_NL(TABLE)*/
将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.
例如:
SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
23. /*+USE_MERGE(TABLE)*/
将指定的表与其他行源通过合并排序连接方式连接起来.
例如:
SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
24. /*+USE_HASH(TABLE)*/
将指定的表与其他行源通过哈希连接方式连接起来.
例如:
SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
25. /*+DRIVING_SITE(TABLE)*/
强制与ORACLE所选择的位置不同的表进行查询执行.
例如:
SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;
26. /*+LEADING(TABLE)*/
将指定的表作为连接次序中的首表.
27. /*+CACHE(TABLE)*/
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
28. /*+NOCACHE(TABLE)*/
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
29. /*+APPEND*/
直接插入到表的最后,可以提高速度.
insert /*+append*/ into test1 select * from test4 ;
30. /*+NOAPPEND*/
通过在插入语句生存期内停止并行模式来启动常规插入.
insert /*+noappend*/ into test1 select * from test4 ;
速度
这篇Tip来自于Jonathan Lewis的站点,
原文链接如下:
www.jlcomp.demon.co.uk/faq/imp_slow.html
为什么IMP速度慢?
1。IMP作了大量的跟普通方式一样的insert
2。IMP时候创建索引通常是logging的,产生了大量的undo和redo
如何提高IMP的速度
1,
不建议使用commit参数,因为当imp失败的时候,会导致很多后续的麻烦事儿
2。增大buffer参数值,以便于一次读进更大的array
3。设置较大的初始化参数sort_area_size,以加快创建索引时候的排序速度
4。增大重作日志的大小,以减少log switch的次数,也就是减少checkpoint次数,减少写磁盘的次数
5。如果要往已经存在的表中追加数据,那么有些情况下,比如表中存在位图索引,那么最好先删除索引,再导入。否则更新索引时会产生大量等待。
6。使用indexfile和indexes参数,再导入数据之后再手工创建索引。
复制代码代码如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion]
“ProductId”=“69713-640-9722366-45198”
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
“CurrentBuild”=“1.511.1 (Obsolete data - do not use)”
“InstallDate”=dword:3f6c976d
“ProductName”=“Microsoft Windows Server 2003”
“RegDone”=“”
“SoftwareType”=“SYSTEM”
“CurrentVersion”=“5.2”
“CurrentBuildNumber”=“3790”
“BuildLab”=“3790.srv03_rtm.030324-2048”
“CurrentType”=“Uniprocessor Free”
“ProductId”=“69713-640-9722366-45198”
“DigitalProductId”=hex:a4,00,00,00,03,00,00,00,36,39,37,31,33,2d,36,34,30,2d,\
39,37,32,32,33,36,36,2d,34,35,31,39,38,00,5a,00,00,00,41,32,32,2d,30,30,30,\
30,31,00,00,00,00,00,00,00,00,e5,3f,e9,6a,2c,ed,25,35,12,ec,11,c9,8d,01,00,\
00,00,00,00,37,03,6d,3f,44,22,06,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,31,32,32,32,30,00,00,00,00,00,00,00,dc,0f,\
00,00,bf,4a,94,6c,80,00,00,00,15,18,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,34,79,ca,d7
“LicenseInfo”=hex:71,84,c7,56,a0,d6,10,6e,70,b4,9f,e9,10,1a,1e,7a,01,a4,41,09,\
25,20,0e,80,83,80,1f,31,27,86,64,1f,31,dc,22,af,f7,7d,aa,e4,2a,b9,e5,e3,6c,\
e2,01,69,85,70,91,be,a7,9f,95,e5
1,TXT文件导入SQL时
303410001401??????? 600 LANG 4-T粤IG? 0220??? 011840628900000?? BPO
303410001501??????? 600 LANDAU中ER? 0220??? 011840628900000?? BPO
303410001601??????? 600 LANG 6-T汉IG? 0220??? 011840628900000?? BPO
有此一TXT文件要导入SQL,有固定数据格式,因无明显界定符,将其导成一列,再在SQL中截取分离,存在以下问题:
数据结构给定的长度是单字节长度,但在SQL中使用substring()一个汉字只算一位,在些要求中因汉字是无固定位置,如只算一位将影响后面数据正确性
解决方法:cast(substring(cast(col001 as varbinary(1000)),39,4) as char(18)) as time_id
就是先将字段转成varbinary类型,这样汉字也算2位,截取就满足了固定格式要求了,然后再转回字符型,
中英文字符混合处理方法数据库教程
,
2,SQL表导出至TXT中
使用cast(????? as char(20))限定
3,取长度
len()汉字只算1位
使用datalength()汉字算2位