Java堂  


MySQL中更新与子查询条件中同一个表中的字段数据

Filed under: Database — Jet @ 4:29 下午
Tags:
原文出处: MySQL中更新与子查询条件中同一个表中的字段数据
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在MySQL中使用update语句的时候,Where条件或者值都可以使用子查询,比如:

  1. UPDATE table_a SET name=(SELECT name FROM table_b WHERE id=1) 
  2. WHERE id IN (SELECT id FROM table_c WHERE age > 24);

但是如果子查询和更新的表是同一个表的话,MySQL会报如下的错误:

Error Code : 1093
You can’t specify target table ‘table_a’ for update in FROM clause

这种情况下就需要使用MySQL的临时表做一个中转,代码如下:

  1. -- 将查询的结果写入到临时表中
  2. CREATE TEMPORARY TABLE tmp_table (SELECT * FROM table_a WHERE NAME='Tom');
  3. UPDATE table_a SET parentId=(SELECT id FROM tmp_table WHERE NAME='Tom') WHERE id = 100;
  4. -- 删除临时表
  5. DROP TABLE tmp_table;

参考资料:
语法:MySQL中INSERT INTO SELECT的使用
MySQL中的临时表使用方法
关于mysql的 SELECT … INTO 语法
MySQL select into 和 SQL select into

MySQL常用命令

Filed under: Database — Jet @ 3:22 下午
Tags:
原文出处: MySQL常用命令
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!
  1. -- Create Users
  2. -- MySQL下创建并授权用户
  3. -- ------------------------------------
  4. grant All on dbname.* to username@localhost identified by "yourpassword";
  5. -- 下面这条命令是MySQL5为了兼容低版本的PHP而创建的
  6. set password for username@localhost =old_password('yourPassword');
  7. flush privileges;
  8.  
  9.  
  10. -- Import/Export
  11. -- MySQL数据导入导出
  12. -- ------------------------------------
  13. use dbname;
  14. source 'filename';
  15. -- 导入数据,mysqldump为bin目录下面的一个命令工具
  16. mysqldump -u username -p dbname > "filename"
  17.  
  18.  
  19. -- Ip 授权IP访问
  20. -- ------------------------------------
  21. -- 授权
  22. grant all on *.* to root@'192.168.1.88' identified by 'yourpassword';
  23. -- 取消
  24. drop user root@'192.168.1.88';

乱码造成本站之前数据破坏,借此谈谈MySQL的乱码问题

Filed under: Database,Life,Tools — Jet @ 3:18 上午
原文出处: 乱码造成本站之前数据破坏,借此谈谈MySQL的乱码问题
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

为了防止升级失败我特意用sqlYog将数据备份了一下,然后升级的过程中没有任何问题,因为我发现原来的栏目排列有些改变,于是就直接清空数据然后再导入备份过的数据重新安装一下系统。当前清空数据库的时候没有多想,反正之前有备份。这个时候问题出现了:导入备份后的数据全部变成了乱码!确切的应该说是错码才对,因为出现的不是问号而是一些错误的中文字。

乱码

反复试了很多种方法依然是无效,后来从sqlYog官方网站上查到sqlYog从6.0开始每次生成的sql文件编码都是utf-8格式的,另外在操作数据之前都使用

  1. set names "utf8";

将所有的环境都设置为utf8编码,你可以在sqlYog的查询窗口中使用

  1. SHOW VARIABLES LIKE 'character_set_%';

查看一下语言环境。sqlYog在查看数据的时候首先查看原来数据库设置的编码格式,然后将其转换为utf8格式的数据,最后输出出来;如果修改数据则相反。上次我在博文中提到使用sqlYog6.03可以直接查看gbk编码的数据,但是查看utf8格式的编码是乱码,我觉得这应该是sqlYog6.03版本中转换编码算法的一个bug,果然在最新发布的6.10rc版本中就修复了这个错误;另外一个就是根数据库默认设置的编码也有很大的关系,因为MySQL使用的默认编码是latin1,正是这样一个非常具有历史原因的设置成为了造成乱码的最直接的原因。这里可能有人会说不是sqlYog操作之前都已经将环境设置为utf8格式了吗?这个时候应该跟MySQL本身的编码没有任何关系了呀。sqlYog操作的时候是不会有关系,但是其他进程(比如php、java等)操作的时候呢?数据写入的时候已经出现乱码了,问题就出在这里。所以为了完全杜绝MySQL的乱码问题,建议将MySQL的默认编码设置为utf8格式。

因为wordpress数据库中的编码都是utf8格式的,我又使用的sqlYog6.03版本,所以无论查看还是备份utf8的数据都是乱码。最后只能是逐一从百度快照中将数据找出来添加到数据库中,因为我在wordpress中设置的remark规则跟时间和最后的数据id号有关系,为了不至于造成在百度中搜索出来的结果失效,所以首先先将原来数据库中的这些数据导入到新的数据中。当然这个时候wordpress已经升级成2.3了,呵呵(苦笑中…)

目前在2006年8月份之前的数据还没有恢复,将近有80条。我会在最近这段时间将他升级完成的。

参考资料:Which MySQL Character Sets are supported by SQLyog?

phpMyAdmin初次安装拒绝登录的问题及解决方法

Filed under: Database,DynamicLanguage,Tools,Web&Server — Jet @ 10:45 下午
原文出处: phpMyAdmin初次安装拒绝登录的问题及解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天安装phpMyAdmin 2.10的时候修改认证方式为cookie之后进入程序首页登录的时候一直提示访问被拒绝,真的是奇怪了。后来从网上查了一下原来是需要清空一下浏览器缓存。

参考资料:hpMyAdmin 2.10.2 配置

SQLyog 6.x 开始支持Unicode编码了!!

Filed under: Database,Tools — Jet @ 6:27 下午
Tags: ,
原文出处: SQLyog 6.x 开始支持Unicode编码了!!
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

sqlyog_box.jpg

一直是使用SQLyog来管理MySQL的,感觉他功能非常的强大,而且使用操作的时候非常的方便。但是一直以来SQLyog有个特别不爽的地方就是不支持Unicode,在查看数据库中的中文时会显示乱码,so如果直接用软件编辑保存的话显示到网页上面就是乱码了,完全没有使用SQL Server管理器那样的方便。

不过现在好了,今天无意间到SQLyog官方网站上面的时候,发现软件已经升级到6.x版本了,我所期待的支持中文的功能也实现了,爽啊~~~

Windows下安装zip包版本的MySQL

Filed under: Database — Jet @ 2:10 上午
Tags:
原文出处: Windows下安装zip包版本的MySQL
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

虽然官方提供了非常好的安装文件,但是有的时候不想每次再重装系统之后都要安装一遍MySQL,需要使用zip包版本的MySQL。在配置的时候有以下几个问题需要了解的,总结一下:

1. 设置MySQL为Windows服务

在Windows下用mysqld-nt.exe可以注册为服务,即用mysqld-nt –install mysql
这会设置为mysqld-nt.exe为mysql服务,相关信息在命令行模式下查询mysqld-nt –verbose –help

2. 启动服务时出现“错误1067”的解决方法

参考手册中明确说明了这个问题:

These messages often occur when the MySQL base or data directories are installed in different locations than the default locations (C:\Program Files\MySQL\MySQL Server 5.0 and C:\Program Files\MySQL\MySQL Server 5.0\data, respectively).

上面的意思是在没有将MySQL安装到默认的目录下面的情况下启动Windows服务的时候就会出现上述提示,解决的办法就是指定MySQL跟目录以及数据库目录。在my.ini文件最后增加以下内容,然后将my.ini拷贝到windows目录下。

  1. [mysqld]
  2. # set basedir to your installation path
  3. basedir=E:/mysql
  4. # set datadir to the location of your data directory
  5. datadir=D:/MySQLdata

3. 初始帐号

用户名root,密码为空,所以说默认情况下的MySQL5是不安全的。进入之后立即修改root帐号密码,命令如下:

  1. set password for root@localhost =password('yourPassword');
  2. flush privileges;

迟到的报道- SQLServer2005 JDBC v1.1正式版发布

Filed under: Database,JavaPlateform — Jet @ 12:49 下午
Tags: ,
原文出处: 迟到的报道- SQLServer2005 JDBC v1.1正式版发布
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

好久没有上SQL Server JDBC网站,原来早在8月29日就更新驱动了,现在是1.1的正式版。从其中一个开发者的博客上看到了更新的内容:

1. Integrated security 增强了安全连接,不过这个功能只支持 Windows 系统。我记得是需要拷贝一个dll文件

2. Client Failover, Database Mirroring support 支持 客户端失效倍援和数据库镜像功能
  数据镜像功能其实是SQL Server2005的一个新功能,现在的JDBC驱动也支持了。关于这个功能更多可参考:http://www.microsoft.com/technet/prodtechnol/sql/2005/dbmirror.mspx
  客户端失效倍援(不知道这个翻译是否准确)的描述是这样的:When connecting to a Sql Server 2005 Database that has a failover partner the JDBC v1.1 driver will cache failover information and retry to the failover partner on primary failure. Additionally you can use the new “failoverPartner” connection string keyword to handle initial connection failure scenarios.

3. 修复了以下上个版本里面的比较严重的bug(前面的数字是提交bug时候产生的序号,没有具体的含义)
<blockquote> <li>426389 Calling Statement.execute no longer causes an SQLException with the

message “sp_cursoropen/sp_cursorprepare: The statement parameter can

only be a single select or a single stored procedure‿ for UPDATE

WHERE queries when the selectMethod=cursor connection property is set.</li>

 <li>436718 Calling PreparedStatement.execute no longer causes an SQLException

with the message “sp_cursoropen/sp_cursorprepare: The statement

parameter can only be a batch or a stored procedure with a single

select, without FOR BROWSE, COMPUTE BY, or variable assignments‿ for

INSERT INTO queries when the selectMethod=cursor connection property is set.</li>
 <li>450639 The driver no longer throws an SQLException with the message “Server

failed to resume the transaction, desc: 4600000001.‿ when configuring

SQL Server 2005 as the JBoss JMS message store.</li>
 <li>435796 Executing SQL WRITETEXT statements no longer throws an SQLException

with the message “No TDS_RET_STATUS was found for the stored procedure

output parameters.‿</li>
 <li>424295 DatabaseMetaData.getMaxConnections no longer throws an SQLException with

the message “The configuration option ‘user connections’ does not exist,

or it may be an advanced option‿ for SQL Server 2005 servers.</li>
 <li>433394 Calling Statement.executeBatch after setting a BLOB value no longer throws

an SQLException with the message “The conversion from BLOB to BINARY is unsupported.‿</li>
 <li>435448 The driver no longer throws an SQLException with the message

“com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near ‘-’‿

when sending a BigDecimal prepared statement parameter value to the server

with the 5.0 JRE.</li></blockquote>
参考资料:
JDBC 2005 v1.1 is now available.
<a href=”http://blogs.msdn.com/angelsb/archive/2006/08/22/713417.aspx” target=”_blank”>http://blogs.msdn.com/angelsb/archive/2006/08/22/713417.aspx</a>

怎样在SQL Server2005中删除数据库用户

Filed under: Database — Jet @ 12:40 下午
Tags:
原文出处: 怎样在SQL Server2005中删除数据库用户
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

以前在SQL Server2000中删除数据库用户很简单,只要直接删除或者使用Drop User命令就可以了,但是SQL Server2005中直接操作是不行的,这是因为在SQL Server 2005中架构是做为实体对待的。所以要删除该用户,需要先删除该用户所拥有的架构或更改此架构的所有者。否则会提示”数据库主体在该数据库中拥有架构,无法删除。

另外,每一个数据库用户对应于一个系统登陆帐号,并且每一个架构只能赋予一个用户。所以直接删除用户的架构是不可以的,可以这样:首先创建一个新的登陆名,然后将需要删除的架构赋予这个新用户。这样就可以删除之前的用户了。

参考资料:
SQL 2005 应用手记
http://silverfox.mynew.ws/blog/index.php?/archives/111-SQL-2005.html

MS SQL Server 中事务日志变大的处理

Filed under: Database — Jet @ 8:44 上午
Tags:
原文出处: MS SQL Server 中事务日志变大的处理
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在SQL Server中经常遇到事务日志变大的情况,除了将数据库设置为“自动收缩”外,还可以使用下面的SQL命令进行快速清除数据库中的事务日志,命令如下:

  1. -- 第一步:清空日志
  2. DUMP TRANSACTION databasename WITH NO_LOG 
  3. -- 第二步:截断事务日志
  4. BACKUP LOG databasename WITH NO_LOG 
  5. -- 第三步:收缩数据库
  6. DBCC SHRINKDATABASE(databasename)

需要说明几点:
1. 上面的SQL命令需要按照顺序执行;
2. 执行上面的命令通常比直接使用右键菜单中的“收缩”命令要快很多

参考资料:
SQL SERVER 数据库日志已满,如何收缩数据库日志
http://blog.csdn.net/faintbear/archive/2005/02/06/283316.aspx
如何收缩数据库日志
http://www.cndiy8.com/data/web5701/20050228/20050228__3794589.html

SQL Server中删除重复数据最快的方法

Filed under: Database — Jet @ 11:34 下午
原文出处: SQL Server中删除重复数据最快的方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

由于种种原因,在数据库中出现了我们不希望出现的重复数据,当对这些重复的数据进行删除的时候有许多种方法。我发现在网上流行的一种方法是利用临时表的方法,SQL脚本如下:

  1. select distinct * into #Tmp from tableName
  2. drop table tableName 
  3. select * into tableName from #Tmp
  4. drop table #Tmp

该方法首先使用select distinct命令将不重复的列表数据写入到临时表#Tmp中,然后删除原来的表,再将临时表中的数据写入到tableName中,最后删除临时表。
但是这种方法执行效率是一个方面,另外如果数据库中有text类型的字段的话将不能执行,非常的有局限性。

下面提供一个通用的方法并且执行效率也是非常不错的,脚本如下:

  1. declare @max int,@rowname varchar(400) 
  2. declare cur_rows cursor local for 
  3.     select repeatedrow,count(*) from tableName  group by repeatedrow having count(*) > 1 
  4.  
  5. open cur_rows 
  6. fetch cur_rows into @rowname ,@max 
  7. while @@fetch_status=0 
  8. begin 
  9.     select @max = @max -1 
  10.     set rowcount @max 
  11.     delete from tableName  where repeatedrow = @rowname 
  12.     fetch cur_rows into @rowname ,@max 
  13. end 
  14. close cur_rows 
  15. set rowcount 0

简单说明一下:首先声明了两个变量,一个是记录重复的数量,另外一个是记录重复字段的值,变量的类型以及长度可根据你实际的字段进行定义;接下来声明一个游标,该游标主要是列出重复的数据以及重复的数量;然后打开游标并从中取出数据,其中“select @max = @max -1”这句的意思是保留一条重复数据,剩下的逐一删除;最后关闭游标,搞定。

执行完教本之后可以使用下面的教本检查是否含有重复的数据:

  1. select repeatedrow,count(*) from tableName  group by repeatedrow having count(*) > 1
下一页 »