‘数据库’ 分类下的所有文章
2010十月1

SqlServer表日期字段提供默认值

sql server 评论关闭

在默认下值项填入: (getdate())

2010十月1

修改当前自增长值

sql server 评论关闭

alter table table_name AUTO_INCREMENT=n;

2010十月1

MySql远程连接账号建立

mysql 评论关闭

?更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改成”%”
注: %代表任何远程账户通过用户名密码都可进入
若改为:host改为:122.11.55.146,则只有这个IP下的用户通过用户名密码才可连接,其它用户即使用户名密码正确了也访问不了。

新建远程账号之后,别忘记在my sql cmd中提交这种更新:flush privileges;

2010十月1

存储过程

sql server 评论关闭

存储过程 就是将T-SQL进行封装成函数,直接调用此过程来进行数据的处理。

优点:存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
将业务逻辑封装在存储过程中,相当于让数据库服务器来分担web服务器的压力。

缺点:与SQL SERVER 绑定,可移植性差

创建:
CREATE PROCEDURE mysp_output
@SUM int output //要返回的变量
@cityID
AS
select @SUM=sum([ID]) from city where id = @cityID
GO

执行:在外部可直接执行: EXEC dbo.frm_user_password ‘getpassword’, ‘admin’ ;

或: EXEC dbo.frm_user_password @tranType = ‘getpassword’, @user = ‘admin’ ;

注:@tranType是存储过程中的参数名,必须要一致

2010十月1

T-SQL 语法

sql server 评论关闭
?
一,SQL变量
?局部变量必须以“@”开头,而且必须先用DECLARE命令说明后才可使用,在Transact-SQL中不能像在一般的程序语言中一样使用“变量=变量值”来给变量赋值。必须使用SELECT或SET命令来设定变量的值,其语法如下:
?? ?SELECT@局部变量=变量值?SET @局部变量=变量值
 declare@id char(10)  select@id=‘10010001’
在Select命令查询数据时,在Select命令中直接将列值赋给变量

?? ?declare@name char(30)@wage money
?? ??? ?select@name=e_name,@wage=e_wage
?? ??? ?from employee
?? ??? ?where emp_id=’10010001′
?? ??? ?select@name as e_name,@wage as e_wage

?? ?
?? ?全局变量:全局变量不是由用户的程序定义的,它们是在服务器级定应义的。只能使用预先说明及定义的变局变量。引用全局变量时,必须以“@@”开头。局部变量的名称不能与全局变量的名称相同、否则会在应用中出错。

二、SQL流程控制命令

?? 1,if

?? ?select @x=1,@y=2, @z=3

  if@x>@y

  print‘x>y’ –打印字符串’x>y’ ? /print 代表输出到控制台

  else if@y>@z

  print’y>z’

  else print’z>y’?

?? ?2,?BEGIN…END

?? ??? ?其语法如下:

  BEGIN

  <命令行或程序块>

  END

  BEGIN…END用来设定一个程序块,将在BEGIN…END内的所有程序视为一个单元执行BEGIN…END经常在条件语句,如IF…ELSE中使用。在BEGIN…END中可嵌套另外的BEGIN…END来定义另一程序块。

3 CASE

  CASE 命令有两种语句格式:

  CASE <运算式>

  WHEN <运算式>THEN<运算式>

  …

  WHEN<运算式>THEN<运算式>

  [ELSE<运算式>]

?se pangu

  update employee

  set e_wage =

  case

  when job_level = ’1’ then e_wage*1.08

  when job_level = ’2’ then e_wage*1.07

  when job_level = ’3’ then e_wage*1.06

  else e_wage*1.05

  end

4 WHILE…CONTINUE…BREAK

  其语法如下:

  WHILE <条件表达式>

  BEGIN

  <命令行或程序块>

  [BREAK]

  [CONTINUE]

  [命令行或程序块]

  END

  WHILE 命令在设定的条件成立时会重复执行命令行或程序块。CONTINUE命令可以让程序跳过CONTINUE 命令之后的语句,回到WHILE 循环的第一行命令。BREAK 命令则让程序完全跳出循环,结束WHILE 命令的执行。WHILE 语句也可以嵌套。

5,其它命令。

?(1)PRINT

  语法如下:

  PRINT ‘any ASCII text’ | @local_variable | @@FUNCTION | string_expression

  PRINT 命令向客户端返回一个用户自定义的信息,即显示一个字符串(最长为255个字符)、局部变量或全局变量。如果变量值不是字符串的话,必须先用数据类型转换函数CONVERT(),将其转换为字符串。其中,string_expression 是可返回一个字符串的表达式。表达式的长度可以超过8000 个字符,但超过8000 的字符将不会显示。

?(2)得到日期? SELECT GETDATE()??? SELECT CONVERT(varchar(100), GETDATE(), 20) : 2009-06-27 09:24:51

6,例子.

?遍历元素

DECLARE @vcum1 char(255)
DECLARE @vcum2 char(255)
DECLARE @vcum3 char(255)

DECLARE? cs1 CURSOR FOR SELECT * FROM city
OPEN cs1
FETCH cs1 INTO @vcum1, @vcum2,@vcum3
WHILE @@FETCH_STATUS = 0
BEGIN
?PRINT @vcum1
?FETCH NEXT FROM cs1 INTO @vcum1, @vcum2,@vcum3
?
END
CLOSE cs1
DEALLOCATE cs1注意:null是个非常特殊的值,什么值与null的运算结果都是null,常常导致语句错误。所以在设计库表结构时,常常设置default值,避免null的出现。但这样会增大数据文件的体积,浪费资源。当表中数值很稀疏时,这种浪费是非常惊人的。

判断是否等于null,不能用=null和<>null,要用 is null 和 is not null 。

设置字段值为null,可以用 update XX set YY=null。null外面不要加引号。

插入新记录用 insert XXX (YYY) values(null)。null外面不要加引号。

特别要注意null与”NULL”、”null”的区别。在SQL Server查询分析器中,null与”NULL”的显示完全相同,非常容易混淆!

2010十月1

远程连接SQL Server 2000服务器

sql server 评论关闭

具体步骤:

一、ping服务器IP能否ping通

观察远程SQL Server 2000服务器的物理连接是否存在。如果不行,请检查网络,查看配置,当然得确保远程sql server 2000服务器的IP拼写正确。

二 在Dos或命令行下输入telnet 服务器IP 端口,看能否连通

如telnet 202.114.100.100 1433

通常端口值是1433,因为1433是SQL Server 2000的对于Tcp/IP的默认侦听端口。如果有问题,通常这一步会出问题。通常的提示是“……无法打开连接,连接失败”。

如果这一步有问题,应该检查以下选项。

1.检查远程服务器是否启动了sql server 2000服务。如果没有,则启动。

2.检查服务器端有没启用Tcp/IP协议,因为远程连接(通过因特网)需要靠这个协议。检查方法是,在服务器上打开 开始菜单->程序->Microsoft SQL Server->服务器网络实用工具,看启用的协议里是否有tcp/ip协议,如果没有,则启用它。

3.检查服务器的tcp/ip端口是否配置为1433端口。仍然在服务器网络实用工具里查看启用协议里面的tcp/ip的属性,确保默认端口为1433,并且隐藏服务器复选框没有勾上。

事实上,如果默认端口被修改,也是可以的,但是在客户端做telnet测试时,写服务器端口号时必须与服务器配置的端口号保持一致。如果隐藏服务器复选框被勾选,则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接,但是Tcp/ip协议的默认端口将被隐式修改为2433,在客户端连接时必须作相应的改变。

4.如果服务器端操作系统打过sp2补丁,则要对windows防火墙作一定的配置,要对它开放1433端口,通常在测试时可以直接关掉windows防火墙(其他的防火墙也关掉最好)。

5.检查服务器是否在1433端口侦听。如果服务器没有在tcp连接的1433端口侦听,则是连接不上的。检查方法是在服务器的dos或命令行下面输入netstat -a -n 或者是netstat -an,在结果列表里看是否有类似 tcp 127.0.0.1 1433 listening 的项。如果没有,则通常需要给sql server 2000打上至少sp3的补丁。其实在服务器端启动查询分析器,输入 select @@version 执行后可以看到版本号,版本号在8.0.2039以下的都需要打补丁。

如果以上都没问题,这时你再做telnet 服务器ip 1433 测试,将会看到屏幕一闪之后光标在左上角不停闪动。恭喜你,你马上可以开始在企业管理器或查询分析器连接了。

三、检查客户端设置

程序->Microsoft SQL Server -> 客户端网络使用工具。像在服务器网络实用工具里一样,确保客户端tcp/ip协议启用,并且默认端口为1433(或其他端口,与服务器端保持一致就行)。

四、在企业管理器里或查询那分析器连接测试

企业管理器->右键SQlserver组->新建sqlserver注册->下一步->写入远程IP->下一步->选Sqlserver登陆->下一步->写入登陆名与密码(sa,password)->下一步->下一步->完成

查询分析器->文件->连接->写入远程IP->写入登录名和密码(sa,password)->确定

通常建议在查询分析器里做,因为默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是4秒,而查询分析器是15秒。

修改默认连接超时的方法:

企业管理器->工具->选项->在弹出的”SQL Server企业管理器属性”窗口中,点击”高级”选项卡->连接设置->在 登录超时(秒) 后面的框里输入一个较大的数字

查询分析器->工具->选项->连接->在 登录超时(秒) 后面的框里输入一个较大的数字

通常就可以连通了,如果提示错误,则进入下一步。

五、错误产生的原因通常是由于SQL Server使用了”仅 Windows”的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:

1.在服务器端使用企业管理器,并且选择”使用 Windows 身份验证”连接上 SQL Server。

2.展开”SQL Server组”,鼠标右键点击SQL Server服务器的名称,选择”属性”,再选择”安全性”选项卡。

3.在”身份验证”下,选择”SQL Server和 Windows “。

4.重新启动SQL Server服务。(在dos或命令行下面net stop mssqlserver停止服务,net start mssqlserver启动服务,也是一种快捷的方法)。

注释:在连接本地服务器时,通常使用的是命名管道协议(在服务器网络实用工具里可以看到启用的协议有这个),默认端口是445,因此在本地能连通是不能说明什么问题的,连接远程服务器是完全不同的协议),再次连接,显示连接成功。

具体步骤:

一、ping服务器IP能否ping通

观察远程SQL Server 2000服务器的物理连接是否存在。如果不行,请检查网络,查看配置,当然得确保远程sql server 2000服务器的IP拼写正确。

二 在Dos或命令行下输入telnet 服务器IP 端口,看能否连通

如telnet 202.114.100.100 1433

通常端口值是1433,因为1433是SQL Server 2000的对于Tcp/IP的默认侦听端口。如果有问题,通常这一步会出问题。通常的提示是“……无法打开连接,连接失败”。

如果这一步有问题,应该检查以下选项。

1.检查远程服务器是否启动了sql server 2000服务。如果没有,则启动。

2.检查服务器端有没启用Tcp/IP协议,因为远程连接(通过因特网)需要靠这个协议。检查方法是,在服务器上打开 开始菜单->程序->Microsoft SQL Server->服务器网络实用工具,看启用的协议里是否有tcp/ip协议,如果没有,则启用它。

3.检查服务器的tcp/ip端口是否配置为1433端口。仍然在服务器网络实用工具里查看启用协议里面的tcp/ip的属性,确保默认端口为1433,并且隐藏服务器复选框没有勾上。

事实上,如果默认端口被修改,也是可以的,但是在客户端做telnet测试时,写服务器端口号时必须与服务器配置的端口号保持一致。如果隐藏服务器复选框被勾选,则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接,但是Tcp/ip协议的默认端口将被隐式修改为2433,在客户端连接时必须作相应的改变。

4.如果服务器端操作系统打过sp2补丁,则要对windows防火墙作一定的配置,要对它开放1433端口,通常在测试时可以直接关掉windows防火墙(其他的防火墙也关掉最好)。

5.检查服务器是否在1433端口侦听。如果服务器没有在tcp连接的1433端口侦听,则是连接不上的。检查方法是在服务器的dos或命令行下面输入netstat -a -n 或者是netstat -an,在结果列表里看是否有类似 tcp 127.0.0.1 1433 listening 的项。如果没有,则通常需要给sql server 2000打上至少sp3的补丁。其实在服务器端启动查询分析器,输入 select @@version 执行后可以看到版本号,版本号在8.0.2039以下的都需要打补丁。

如果以上都没问题,这时你再做telnet 服务器ip 1433 测试,将会看到屏幕一闪之后光标在左上角不停闪动。恭喜你,你马上可以开始在企业管理器或查询分析器连接了。

?

三、检查客户端设置

程序->Microsoft SQL Server -> 客户端网络使用工具。像在服务器网络实用工具里一样,确保客户端tcp/ip协议启用,并且默认端口为1433(或其他端口,与服务器端保持一致就行)。

?

四、在企业管理器里或查询那分析器连接测试

企业管理器->右键SQlserver组->新建sqlserver注册->下一步->写入远程IP->下一步->选Sqlserver登陆->下一步->写入登陆名与密码(sa,password)->下一步->下一步->完成

查询分析器->文件->连接->写入远程IP->写入登录名和密码(sa,password)->确定

通常建议在查询分析器里做,因为默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是4秒,而查询分析器是15秒。

修改默认连接超时的方法:

企业管理器->工具->选项->在弹出的”SQL Server企业管理器属性”窗口中,点击”高级”选项卡->连接设置->在 登录超时(秒) 后面的框里输入一个较大的数字

查询分析器->工具->选项->连接->在 登录超时(秒) 后面的框里输入一个较大的数字

通常就可以连通了,如果提示错误,则进入下一步。

?

五、错误产生的原因通常是由于SQL Server使用了”仅 Windows”的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:

1.在服务器端使用企业管理器,并且选择”使用 Windows 身份验证”连接上 SQL Server。

2.展开”SQL Server组”,鼠标右键点击SQL Server服务器的名称,选择”属性”,再选择”安全性”选项卡。

3.在”身份验证”下,选择”SQL Server和 Windows “。

4.重新启动SQL Server服务。(在dos或命令行下面net stop mssqlserver停止服务,net start mssqlserver启动服务,也是一种快捷的方法)。

?

注释:在连接本地服务器时,通常使用的是命名管道协议(在服务器网络实用工具里可以看到启用的协议有这个),默认端口是445,因此在本地能连通是不能说明什么问题的,连接远程服务器是完全不同的协议),再次连接,显示连接成功。

2010十月1

乱码

mysql 评论关闭
 1 工程
工程内所有的 .java .jsp .xml .txt 都有默认的编码 默认的是系统环境的编码
我们中文系统通常是GBK 推荐都采用utf-8
utf-8 的时候 你编译 生成doc 可能会遇到乱码(特别是采用ant 的时候,生成doc你几乎100%会遇到)

解决方法 以ant 为例子
编译 注意 encoding 参数

       
       
           
           
       
   

生成doc 注意 encoding 和 charset







这里 的encoding 就是指的你 java 文件的编码格式 javac 和javadoc 都有这个参数
charset 指的是 生成 doc 后的编码方式 javadoc 的参数

2 数据库
mysql 的编码最复杂 从4以后 mysql 号称支持多编码 它更灵活了 我们也更麻烦了
mysql 有4个级别的编码
系统级
库级
表级
sql语句级
请保持采用统一的编码 推荐utf-8
其它数据库要简单的多 一般都是一种编码

3 web server
tomcat 为例
tomcat server.xml 中一个参数

经测试 这个URIncoding 参数主要是 get 方法中采用编码

4 jsp 显示层
第1条中说明了 jsp 文件本身的格式
很多朋友采用eclipse +myeclipse 生成jsp
它自动生成一个头<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
不要误解 这句话不能保证你在ie里看到的不是乱码
pageEncoding它的意思是 这个页面本身采用的是 utf-8 (似乎只在eclipse 里有效果 ,我不确定)
为了在ie 里不乱码  你还得加一句 <%@ page contentType="text/html; charset=UTF-8"%>
它不能在(myeclispe)自动生成  推荐修改 myeclipse的模板 在下边的目录里
MyEclipse\eclipse\plugins\com.genuitec.eclipse.wizards_4.0.1\Templates
里边的jsp模版 你加上<%@ page contentType="text/html; charset=${encoding}"%>

5 filter
自从tomcat 4 以后 网上就流传了一个SetCharacterEncodingFilter 过滤器 搜一下有很多
很好用 web.xml 中加入

?? Set Character Encoding
?? filters.SetCharacterEncodingFilter
?? 
??
encoding
??
utf-8
?? 

?? 
?? Set Character Encoding
?? /*
?? 

6 资源文件
首先保证 文件本身是utf-8
然后部署的时候用 native2ascii 转换
这里给出 ant 里的例子

2010十月1

MySql数据库实现分页

mysql 评论关闭
SELECT * FROM table WHERE ... LIMIT [offset,] rows | rows OFFSET offset

SELECT * FROM table LIMIT 5;     //检索前 5 个记录行  等同于:SELECT * FROM table LIMIT 0,5;     //检索前 5 个记录行
SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.

select * from news  limit 2  offset 4
// 从第5行记录开始查2条,而 select * from news  limit 2 ,4 是从第3行记录开始查4条。此时2为offset
2010十月1

MySql 不支持子查询的变通方法

mysql 评论关闭
到目前为止,MySQL 还不能支持这样的操作,子查询的 FROM 字句和更新/删除对象不能使用同一张表。

mysql> DELETE FROM tab1 WHERE col1 = ( SELECT MAX( col1 ) FROM tab1 );ERROR 1093 (HY000): You can't specify target table 'tab1' for update in FROM clause

针对“同一张表”这个限制,撇开效率不谈,多数情况下都可以通过临时表来变通解决,像这样

DELETE FROM tab1WHERE col1 = (  SELECT MAX( col1 )  FROM (    SELECT * FROM tab1  ) AS t);