Mysql

確保 MySQL 數據庫完全採用 UTF8 的最佳方法

  • September 15, 2009

在 UTF8 和非 UTF8 字元串出現一些問題之後,我們正在對 UTF8 進行標準化。我需要做的一件事是檢查 MySQL 數據庫中的所有內容是否都是 UTF8 格式?我需要檢查什麼?

  • 伺服器預設字元集
  • 每個數據庫的預設字元集
  • 每個文本列都有一個字元集嗎?我該如何檢查?

我正在考慮將所有這些都放在一個 nagios 外掛中,以檢查所有內容是否都在 UTF8 中。建議?

Rory,首先,您希望監控數據庫中創建的內容是正確的。雖然我們都實施了防止錯誤的步驟,但您不能假設錯誤不會蔓延。我做的事情非常相似,因為我們的大多數基礎設施都需要 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';

引用自:https://serverfault.com/questions/32228