确保MySQL数据库完全使用UTF8的最佳方法

在使用UTF8和非UTF8string的一些问题之后,我们正在使用UTF8进行标准化。 我需要做的一件事是检查在MySQL数据库中的一切都是UTF8? 我需要检查什么?

  • 服务器默认字符集
  • 每个数据库的默认字符集
  • 每个文本列都有一个字符集? 我如何检查?

我正在考虑把所有这一切都放在一个nagios插件来检查一切是在UTF8。 build议?

Rory,首先,你想要监视在你的数据库中创build什么是正确的。 虽然我们都采取措施来防止错误,但是不能认为这些错误不会发生。我做了一个非常类似的事情,因为我们的大部分基础设施都需要UTF8。

以下查询适用于检查统计信息:

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, COUNT(0) AS COUNT FROM information_schema.SCHEMATA GROUP BY DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME; # to filter schema use SCHEMA_NAME in the where clause SELECT TABLE_COLLATION, COUNT(0) AS COUNT FROM information_schema.TABLES WHERE TABLE_COLLATION IS NOT NULL GROUP BY TABLE_COLLATION; # to filter schema use TABLE_SCHEMA in the where clause SELECT CHARACTER_SET_NAME, COLLATION_NAME, COUNT(0) AS COUNT FROM information_schema.COLUMNS WHERE CHARACTER_SET_NAME IS NOT NULL AND COLLATION_NAME IS NOT NULL GROUP BY CHARACTER_SET_NAME, COLLATION_NAME; # to filter schema use TABLE_SCHEMA in the where clause 

如果发现任何结果,那么通过发送电子邮件给您的cron作业,以下查询将会很好:

 SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE DEFAULT_CHARACTER_SET_NAME NOT LIKE '%utf8%' OR DEFAULT_COLLATION_NAME NOT LIKE '%utf8%'; # to filter schema use SCHEMA_NAME in the where clause SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_COLLATION IS NOT NULL AND TABLE_COLLATION NOT LIKE '%utf8%'; # to filter schema use TABLE_SCHEMA in the where clause SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE CHARACTER_SET_NAME NOT LIKE '%utf8%' OR COLLATION_NAME NOT LIKE '%utf8%'; # to filter schema use TABLE_SCHEMA in the where clause 

这些查询适用于MySQL> = 5.0。 如果您需要帮忙编写cron工作,请告诉我。

我的开发人员(主要是Ruby on Rails团队)在创buildInnoDB表时也遇到了问题。 为了保持这一点,我使用一个cron来监视临时数据库:

 SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE ENGINE = 'InnoDB'; 

我会做一些像mysqldump –all-databases –no-data | grep -i字符

jure1873build议使用grep,我评论说awk更合适。 这是我扔在一起。

 mysqldump --all-databases --no-data | awk '{gsub("[`;]","");};/^USE /{db=$2;};/CREATE TABLE /{table=$3;};/^\) ENGINE/{sub(".*CHARSET=","");if(!match($1,"utf8")){print db ":" table ":" $1;}}' 

这里增加了可读性:

 mysqldump --all-databases --no-data | \ awk ' { gsub("[`;]",""); }; /^USE /{ db=$2; }; \ /CREATE TABLE /{ table=$3; }; \ /^\) ENGINE/{ sub(".*CHARSET=",""); if(!match($1,"utf8")){ print db ":" table ":" $1; } } ' 

Nagios真的是这样的错误工具。 Nagios更多用于服务监控,不检查configuration是错误的。 一个更好的工具是像puppet或cfengine这样的configurationpipe理工具,以确保configuration文件具有正确的设置。

就实际configuration而言,MySQL手册在字符集和编码方面有非常全面的章节 。

 dbs=$(echo 'show databases;' | mysql | grep -v '^Database$' | tr "\n" " ") for d in ${dbs}; do tables=$(echo 'show tables' | mysql $d | grep -v '^Tables' | tr "\n" " ") for t in ${tables}; do echo "**************** DB ${d} TABLE ${t}" mysqldump --no-data ${d} ${t} | grep COLLATE | grep -v utf && echo "DB ${d} TABLE ${t} !!!!" mysqldump --no-data ${d} ${t} | grep CHARSET | grep -v utf && echo "DB ${d} TABLE ${t} !!!!" done done