# 囊括三个层级:DB、Table、Column
mysql> create database d charset utf8;
Query OK, 1 row affected (0.04 sec)
mysql> create table d.t
-> (str varchar(10) charset latin1)
-> default charset=utf8;
Query OK, 0 rows affected (0.05 sec)mysql> desc sakila.actor; +-------------+----------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------------------+------+-----+-------------------+-----------------------------+ | actor_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(45) | NO | | NULL | | | last_name | varchar(45) | NO | MUL | NULL | | | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------------+----------------------+------+-----+-------------------+-----------------------------+ 4 rows in set (0.00 sec)
[root@DataHacker ~]# cat dbapi.py #!/usr/bin/env ipython #coding = utf-8 #Author: linwaterbin@gmail.com #Time: 2014-1-29 import MySQLdb as dbapi USER = \'root\' PASSWD = \'oracle\' HOST = \'127.0.0.1\' DB = \'sakila\' conn = dbapi.connect(user=USER,passwd=PASSWD,host=HOST,db=DB)
[root@DataHacker ~]# ./show_charset.py --version 1.0
[root@DataHacker ~]# ./show_charset.py -h Usage: show_charset.py [options][ ...] Options: --version show program\'s version number and exit -h, --help show this help message and exit -d DB_NAME Database name(leave blank is all Databases) -t T_NAME Table name (leave blank is all tabless) -c C_NAME Column name(leave blank is all columns)
[root@DataHacker ~]# ./show_charset.py -d sakila -t actor sakila.actor.first_name: utf8 utf8_general_ci sakila.actor.last_name: utf8 utf8_general_ci
mysql> create table tt (str char(2) charset utf8); Query OK, 0 rows affected (0.20 sec) mysql> create table tt (str int(11) charset utf8); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'charset utf8)\' at line 1
[root@DataHacker ~]# cat show_charset.py #!/usr/bin/env python from optparse import OptionParser from dbapi import conn import MySQLdb # 函数一:命令行参数输入 def parse_options(): parser = OptionParser(usage="%prog [options][ ...]",version=\'1.0\',) parser.add_option("-d",dest="db_name",help="Database name(leave blank is all Databases)") parser.add_option("-t",dest="t_name",help="Table name (leave blank is all tabless)") parser.add_option("-c",dest="c_name",help="Column name(leave blank is all columns)") return parser.parse_args() # 主功能实现:显示字符集 def show_charsets(): query="""select * from information_schema.columns where table_schema not in (\'mysql\',\'INFORMATION_SCHEMA\') and character_set_name is not null""" #三个if条件实现过滤 if options.db_name: query += " and table_schema=\'%s\'" % options.db_name if options.t_name: query += " and table_name=\'%s\'" % options.t_name if options.c_name: query += " and column_name=\'%s\'" % options.c_name #默认返回值形式是元组,我们通过属性cursors.DictCursor转为字典 cur = conn.cursor(MySQLdb.cursors.DictCursor) cur.execute(query) for record in cur.fetchall(): character_set_name = record[\'CHARACTER_SET_NAME\'] collation_name = record[\'COLLATION_NAME\'] print "%s.%s.%s:\t%s\t%s" % (record[\'TABLE_SCHEMA\'],record[\'TABLE_NAME\'],record[\'COLUMN_NAME\'],character_set_name,collation_name) cur.close() #采用try-finally形式关闭数据库连接 try: options,args = parse_options() show_charsets() finally: conn.close()
[root@DataHacker ~]# ./modify.py -h Usage: modify.py schema_name.table_name.column_name new_charset_name [new_collate_name] Options: --version show program\'s version number and exit -h, --help show this help message and exit
#修改前
mysql> show create table testdb.t\G;
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) CHARACTER SET latin1 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
#修改
[root@DataHacker ~]# ./modify.py testdb.t.name gbk
successfully executed:
alter table testdb.t modify column name varchar(10) CHARSET gbk
#修改后
mysql> show create table testdb.t\G;
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) CHARACTER SET gbk DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
[root@DataHacker ~]# cat modify.py
#!/usr/bin/env python
import MySQLdb
from dbapi import *
from optparse import OptionParser
#这里省略掉option值,只要求输入args
def parse_options():
parser = OptionParser(usage="\n%prog schema_name.table_name.column_name new_charset_name [new_collate_name]",version=\'1.0\',)
return parser.parse_args()
#主程序
def modify_column():
cur = conn.cursor(MySQLdb.cursors.DictCursor)
v_sql = """
select * from information_schema.columns
where table_schema=\'%s\'
and table_name=\'%s\'
and column_name=\'%s\'""" % (schema_name,table_name,column_name)
cur.execute(v_sql)
row = cur.fetchone()
#当row为null时,程序请求检查column是否存在
if not row:
print "please check schema_name.table_name.column_name whether exists ?"
exit(1)
column_type = row[\'COLUMN_TYPE\']
column_default = row[\'COLUMN_DEFAULT\']
is_nullable = (row[\'IS_NULLABLE\'] == \'YES\')
query = "alter table %s.%s modify column %s %s" % (schema_name,table_name,column_name,column_type)
query += " CHARSET %s" % new_charset
if collation_supplied:
query += "COLLATE %s" % new_collation
if not is_nullable:
query += "NOT NULL"
if column_default:
query += "DEFAULT \'%s\'" % column_default
try:
alter_cur = conn.cursor()
alter_cur.execute(query)
print "successfully executed:\n \t%s" % query
finally:
alter_cur.close()
cur.close()
try:
(options,args) = parse_options()
if not 2<= len(args) <=3:
print "Usage: schema_name.table_name.column_name new_charset_name [new_collate_name]"
exit(1)
column_tokens = args[0].split(".")
if len(column_tokens) != 3:
print "column must in the following format: schema_name.table_name.column_name"
exit(1)
schema_name,table_name,column_name = column_tokens
new_charset = args[1]
collation_supplied = (len(args) == 3)
if collation_supplied:
new_collation = args[2]
modify_column()
finally:
if conn:
conn.close()
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26515977/viewspace-1208260/ ,如需转载,请注明出处,否则将追究法律责任。