更改字符集设置[译文]

更改字符集设置
原文设置:http://www.mysqlperformanceblog.com/2009/03/17/converting-character-sets/

Web世界已经走向UTF8;Drizzle选中它作为默认的字符集。大多网站后端用utf-8来存储文本数据,另外那些用latin1字符集的网也开始将他们的数据库迁移到utf8;google一下”mysql convert charset to utf8″,可以找到大量的网站,每个途径都有些微的不同,又在某些方面都有些不对。我会总结一下这些方法,说明他们为什么不奏效,然后给出一段脚本,大致上可以用来转换一个数据库或是一系列表到目标字标集。

方法一:

ALTER TABLE `t1` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

拿这个数据表作例子,我们可以看到这种方法为啥子行不通呢。

SQL:

1.
mysql> CREATE TABLE `t1` (
2.
-> `c1` text NOT NULL
3.
-> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
4.
Query OK, 0 rows affected (0.02 sec)
5.

6.
mysql> ALTER TABLE `t1` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
7.
Query OK, 0 rows affected (0.02 sec)
8.
Records: 0 Duplicates: 0 Warnings: 0
9.

10.
mysql> SHOW CREATE TABLE `t1`G
11.
*************************** 1. row ***************************
12.
TABLE: t1
13.
CREATE TABLE: CREATE TABLE `t1` (
14.
`c1` mediumtext NOT NULL
15.
) ENGINE=MyISAM DEFAULT CHARSET=utf8
16.
1 row IN SET (0.01 sec)


注意这里的c1隐含的从text到mediumtext的转换。这种方法能引起改变的数据类型和没有提示的截断,这从我们的目的上说是不能接受的。

方法二[在这里记录着]:

这种方法在转换之前,把所有的数据都转成了他二进制相似的数据类类型,避免了隐含的类型转换。由于实现方式的限制,他把原来以二进制形式存储的数据列也转成了文本的近似列。另外,这种方式有可能因为二进制数据不能进行全文检索而失败。即使这些解决了,这个过程也因为它过多的在每个表上执行alter语句而不能用在大数据量的数据库上。这些语句包括:
1) Drop FULLTEXT indexes
2) Convert target columns to their binary counterparts
3) Convert the table to the target character set
4) Convert target columns to their original data types
5) Add FULLTEXT indexes back
由于这些语句有时执行一句我们都需要花上n个钟头(我们是不是该庆幸是用小时来计数而不是用天来计数?),这也是不可接受的。

方法三:
导出整个数据库,再导入进去。当然,导入导出时选用正确的server端和client端字符集。
这是一个有三个步骤的过程。我们先导出数据库结构,然后手工编辑把数据字符集修改正确,接出单独导出数据。接下来,创建数据表结构,导入数据。如果你在使用复制(replication),这通常不太可取,因为这样导致可笑的一大堆日志,并引起复制链上所有服务器重新载入数据。
除开方法一之外,这些方法都不必要地麻烦。针对方法一,考虑一下下面这个alter语句:

1.
ALTER TABLE `t1`
2.
DEFAULT CHARSET=utf8,
3.
MODIFY COLUMN `c1` text CHARACTER SET utf8;

这个语句能转换整个表的默认字符集和目标数据表列的字符集,并且保持全文索引不变。对于一个指定的数据表,只需要一句sql语句。一个perl脚本已经写好了,它可以将这个alter table 的操作原子化,您可以从这里下载:

$ wget http://www.pablowe.net/convert_charset

当这个脚本完成后,它会加到launchpad的Percona Tools 中去(也许是maatkit,如果证明是足够有用的话).它的一些不错的特性包括:
1.对字符型外键的恰当处理。(当下还没搞定,不过你可能最好不要使用字符型外键)
2.可以调节这个脚本创建的线程数目。(目前是每个表一个线程).
用法:

Usage:
convert_charset –database=database [options]
Options:
–askpass Prompt for a MySQL password
–charset The target character set to convert to
–collate The target collation to convert to
–database|d The target database
–help|? Display this help and exit
–host|h The target host
–ignore-columns Columns to ignore, useful if you want to
keep the existing charset for a target column
Comma-separated. NO SPACES.
table.column
–ignore-tables A comma-separated list of tables to ignore
–password|p The MySQL password to use
–port The target port
–tables A comma-separated list of tables to convert.
All non-named tables will be ignored
–test Print the ALTER statements that would be executed
without executing them.
–user|u The MySQL user
–version|V Display version information and exit
defaults are:
ATTRIBUTE VALUE
————————– ——————
askpass FALSE
charset utf8
collate No Default Value
database No Default Value
help FALSE
host localhost
ignore-columns No Default Value
ignore-tables No Default Value
password No Default Value
port 3306
tables No Default Value
test FALSE
user Current User
version FALSE

archlinux 配置声卡

1.最新的内核已经将alsa包含了进去,我们不再需要安装alsa了,只需要安装alsa相关的工具就行了:
pacman -S alsa-lib alsa-utils alsa-oss
2.安装好以后就可以用alsaconf进行配置:
sudo alsaconf
这个基本没啥好说的,一路回车就OK了。
3.设置音量并保存
sudo alsamixer
sudo alsactl store
4. 设置alsa随系统启动
编辑/etc/rc.conf在DAEMONS里添加alsa, 如
DAEMONS=(syslog-ng network netfs crond kdm gpm alsa)
5.最最大的问题:
(在这里我花了大半天的时间,我公司里的HP的本,即不是很老,也没有我家里的正常工作的本本新,就是不出声,配置过程中也不点儿都没看到错误信息)
Archlinux下用alsaconf检测时,会把主板的那个只会吱吱响的东东识别成一个声卡,所以经常检测出来是两张声卡。现在我们要做的是,把这个破“声卡“干掉。
办法:
编辑/etc/rc.conf, 在MODULES=(…)一行中,在snd-pcsp的前面加一个感叹号,就是不自动加载这个模块的意思。老版本的使用MOD_BLACKLIST来达到这个效果。
再重启,马上发现声卡就很好使了!