Windows下mysql命令行工具插入和显示中文数据

my.ini里client和mysqld都设置了default-character-set=utf8
数据库和表的默认字符集也都是utf8,用MySQL Query Browser工具插入和查询中文输入没有问题,但直接在命令提示符里用mysql工具插入和查询有中文乱码。

与 http://www.javaworld.com.tw/jute/post/view?bid=21&id=128513&sty=1&tpg=1&age=0 里说的一样,好像win下mysql命令行工具不认。

解决办法:
插入数据前,set names utf8;
执行查询前,set name gbk;

Windows XP下安装MySQL遇到的两个问题

原来的安装用的是直接解压zip包的方式,安装情况如下:
1. 安装目录为C:\mysql-4.1.22-win32
2. my.ini从my-medium.ini修改而来,放在了C:\WINDOWS下
3. 安装Windows服务用的命令是 mysqld-nt –install
4. net start MySQL启动服务没有问题

但用MySQL Administrator工具连接时总是先弹出一个对话框,报告

Either the server service or the configuration file could not be found. Startup variables and service section are therefore disalbed.

点“确定”后才进入主界面,正如它所说,Service Control和Startup Variables功能都被禁用了,界面上有红色的提示信息

This section is only available when connected to localhost.

换用msi安装包,重新安装MySQL,目录还是选择C:\mysql-4.1.22-win32(除了data目录之外,其他目录都已删除),最后配置实例时出现无法启动服务的问题。尝试逐个关闭my.ini中选项的方法,试验到底是那个选项导致不能启动。最后发现是innodb_log_file_size这个选项的问题。原来实际的log文件ib_logfile0和ib_logfile1的大小是5M,是由刚才的那个my.ini(即有zip包中my-medium.ini手工修改而来的)指定的,而现在的my.ini(由MySQL Server Instance Config Wizard生成)中同样的选项指定的却是17M,结果导致MySQL无法启动。解决办法是要么删除原来的那两个log文件,要么修改innodb_log_file_size。

现在可以正常启动MySQL服务,MySQL Administrator也可以正常使用。在注册表里查看MySQL Server Instance Config Wizard生成的MySQL服务,发现ImagePath的值是

C:\mysql-4.1.22-win32\bin\mysqld-nt --defaults-file=C:\mysql-4.1.22-win32\my.ini MySQL

说明之前MySQL Administrator报错的原因是服务由mysqld-nt –install命令创建,导致它找不到my.ini。

glade+pygtk学习 (3)

这几天用pygtk和glade写了一个不大的应用,在ubuntu下开发,然后移植到Maemo平台。

学习的过程中发现了SimpleGladeApp.py这个module,可以更方便地以面向对象的方式使用libgrade。

还记得serverinfo这个例子吗?里面是这样得到一个widget的实例的:

  1. self.wTree = gtk.glade.XML(self.gladefile, self.windowname) 
  2. self.logwindowview = self.wTree.get_widget("textview1")

用了SimpleGladeApp.py,直接用self.logwindowview就行了。

下面是改造serverinfo使用SimpleGladeApp.py的步骤:

1. 从 http://www.gnomefiles.org/app.php/SimpleGladeApp.py 下载SimpleGladeApp.py

2. 解压缩后把tepache这个脚本放到你的PATH环境变量指定的路径下,比如/usr/local/bin,然后加上执行权限。

3. 我们已经有现成的serverinfo.glade文件了,现在要做的是用tepache这个脚本解析glade文件来生成一个Python模块,里面是一些对应window或dialog等顶层widget的class,并实现他们的callback方法。命令如下(-o选项是为了不覆盖原来的serverinfo.py):

$ tepache serverinfo.glade -o serverinfo_new.py
written file serverinfo_new.py
$ ls
serverinfo.glade   serverinfo_new.py       serverinfo.py
serverinfo.gladep  serverinfo_new.py.orig  SimpleGladeApp.py

可以看到tepache生成了三个文件:serverinfo_new.py, serverinfo_new.py.orig, SimpleGladeApp.py
.orig文件很重要,tepache用这个文件保护你在serverinfo_new.py添加的代码,所以不要删除这个文件。

可以先运行serverinfo_new.py看看效果。

4. serverinfo_new.py的部分代码:

  1. ......
  2. # Warning: Do not modify any context comment such as #--
  3. # They are required to keep user's code
  4. ......
  5. from SimpleGladeApp import SimpleGladeApp
  6. from SimpleGladeApp import bindtextdomain
  7.  
  8. app_name = "serverinfo"
  9. app_version = "0.0.1"
  10.  
  11. glade_dir = ""
  12. locale_dir = ""
  13.  
  14. bindtextdomain(app_name, locale_dir)
  15.  
  16. class Serverinfo(SimpleGladeApp):
  17.  
  18.     def __init__(self, path="serverinfo.glade",
  19.                  root="serverinfo",
  20.                  domain=app_name, **kwargs):
  21.         path = os.path.join(glade_dir, path)
  22.         SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
  23.  
  24.     #-- Serverinfo.new {
  25.     def new(self):
  26.         print "A new %s has been created" % self.__class__.__name__
  27.     #-- Serverinfo.new }
  28.  
  29.     #-- Serverinfo custom methods {
  30.     #   Write your own methods here
  31.     #-- Serverinfo custom methods }
  32.  
  33.     #-- Serverinfo.on_serverinfo_destroy {
  34.     def on_serverinfo_destroy(self, widget, *args):
  35.         print "on_serverinfo_destroy called with self.%s" % widget.get_name()
  36.     #-- Serverinfo.on_serverinfo_destroy }
  37. ......  
  38. #-- main {
  39.  
  40. def main():
  41.     serverinfo = Serverinfo()
  42.     demodialog = Demodialog()
  43.  
  44.     serverinfo.run()
  45.  
  46. if __name__ == "__main__":
  47.     main()
  48.  
  49. #-- main }

5. 现在就可以添加一些代码来实现serverinfo的功能了。注意不要修改形如#– Demodialog custom methods { 这样的注释,否则如果界面(glade文件)有了改动,tepache就没法做patch了。

把原来的insert_row改成ServerInfo类的一个方法,放在#– Serverinfo custom methods 注释之间。
goUrl方法也放在这里。 注意访问widget实例的方法已经由

host = self.wTree.get_widget("entry1").get_text()

变成

host = self.entry1.get_text()

main方法里的实例化Demodialog的语句要挪到button2的clicked事件响应方法里,不然程序一运行对话框就出现了,你刚才一定注意到了。

destroy响应方法里加入self.gtk_main_quit()以便窗口销毁时能够退出程序。

6. 现在运行serverinfo_new.py,原来serverinfo.py的功能基本上都有了。但有一个问题,对话框弹出后点击“确定”或“取消”按钮都不能关闭对话框。我的解决办法是不在glade设计这个对话框,完成在程序里用代码实现。

7. 注意每次重新设计了界面,修改了glade文件,都要运行tepache来patch生成的python模块,已做的修改不会被覆盖。

新的代码下载地址: http://guoyong.org/?dl=pygtk-learning-serverinfo-simplegladeapp.tar.bz2