我正在爲一個網站使用flourishlib。我的客戶要求我們應該可以在手機上使用emojis。理論上,我們應該將字符編碼從utf8更改爲utf8mb4。如何支持emojis蓬勃發展?
到目前爲止,一切都很好,但是,如果我們把這個開關,像這樣:
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
然後每個角色將使用四個字節,而不是三個字節。這會使數據庫的大小增加33%。這會導致更糟的性能和更多的存儲空間用完。所以,因此,我們決定只爲特定表的特定列切換到utf8mb4的編碼。
爲了確保一切都正常,我檢查了幾件事情。其中,我已經檢查flourishlib,發現了幾個可疑零件:
有一個fUTF8類,它似乎不支持utf8mb4
在fDatabase我引用了一些研究結果:
if ($this->connection && function_exists('mysql_set_charset') && !mysql_set_charset('utf8', $this->connection)) { throw new fConnectivityException( 'There was an error setting the database connection to use UTF-8' ); } //... // Make MySQL act more strict and use UTF-8 if ($this->type == 'mysql') { $this->execute("SET SQL_MODE = 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE'"); $this->execute("SET NAMES 'utf8'"); $this->execute("SET CHARACTER SET utf8"); }
在fSQLSchemaTranslation我可以看到這一點:
$sql = preg_replace('#\)\s*;?\s*$#D', ')ENGINE=InnoDB, CHARACTER SET utf8', $sql);
我懷疑flourishlib不會支持我們追求製作少數幾個表的字符編碼爲utf8mb4。我想知道我們是否可以升級某種方式來提供這種支持。作爲最壞的情況,我們可以覆蓋utf8到utf8mb4的每個文本事件。但是,這將是一個非常醜陋的黑客,我們想知道是否有更好的解決方案。我們應該做這個黑客還是有更正統的做法?
裏克,這個問題被標記爲flourishlib。這意味着它是蓬勃發展的。這意味着如果您對flourishlib沒有任何瞭解,那麼您無法回答。 –
看來你對varchars的爭論是有效的。 –
「向flourishlib投訴或放棄它(這些論壇中的太多問題都是關於第三方軟件包不足的投訴,而不是MySQL本身)」ummm ...問題標籤爲flourishlib,因此這句話完全無效。請閱讀更多關注的問題。我真的很想接受你的答案,但如果你不編輯它們至少解決問題,那麼我將被迫對它們進行投票。 –