Лучший способ убедиться, что база данных MySQL полностью в UTF8
После некоторых проблем со строками UTF8 и без UTF8 мы стандартизируем UTF8. Одна вещь, которую мне нужно сделать, это проверить, что все в UTF8 в базе данных MySQL? Что мне нужно проверить?
- Набор символов по умолчанию для сервера
- Набор символов по умолчанию для каждой базы данных
- У каждого текстового столбца есть набор символов? Как я могу проверить это?
Я думал поместить все это в плагин nagios, чтобы проверить, что все в UTF8. Предложения?
5 ответов
Рори, во-первых, ты прав, когда хочешь следить за тем, что создается в твоих базах данных. Хотя мы все реализуем шаги по предотвращению ошибок, вы не можете предполагать, что ошибки не закрадываются. Я делаю очень похожую вещь, поскольку большая часть нашей инфраструктуры требует 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), создающими таблицы InnoDB, когда они не нужны. Чтобы сохранить это в тайне, я отслеживаю промежуточную базу данных с помощью cron, который вызывает:
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE ENGINE = 'InnoDB';
Я бы сделал что-то вроде mysqldump --all-database --no-data | grep -i персонаж
Jure1873 предлагает использовать 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;
}
}
'
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
Nagios - действительно неправильный инструмент для этого. Nagios - это больше для мониторинга сервисов, а не проверки неправильной конфигурации. Лучшим инструментом будет какой-то инструмент управления конфигурацией, например, puppet или cfengine, чтобы убедиться, что файлы конфигурации имеют правильные настройки.
Что касается собственно конфигурации, руководство по MySQL содержит очень обширную главу о наборе символов и кодировании.