![](/img/trans.png)
[英]In MySQL, what do I put inside my.cnf so that all tables are UTF-8 that works with emojis by default?
[英]Change MySQL default character set to UTF-8 in my.cnf?
目前我們在 PHP 中使用以下命令在我們的應用程序中將字符集設置為UTF-8 。
由於這有點開銷,我們想將其設置為 MySQL 中的默認設置。我們可以在 /etc/my.cnf 或其他位置執行此操作嗎?
SET NAMES 'utf8'
SET CHARACTER SET utf8
我在 /etc/my.cnf 中尋找默認字符集,但那里沒有關於字符集的信息。
此時,我執行了以下操作,將 MySQL 字符集和排序規則變量設置為 UTF-8:
skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8
這是處理這個問題的正確方法嗎?
要將默認設置為 UTF-8,您需要將以下內容添加到 my.cnf/my.ini
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
collation-server = utf8mb4_unicode_520_ci
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
如果您想更改現有數據庫的字符集,請告訴我......您的問題沒有直接指定它,所以我不確定這是否是您想要做的。
編輯:我在原始答案中用utf8mb4
替換了utf8
,因為utf8
只是 UTF-8 的一個子集。 MySQL 和 MariaDB 都調用 UTF-8 utf8mb4
。
對於最新版本的 MySQL,
default-character-set = utf8
導致問題。 我認為它已被棄用。
正如Justin Ball在“ 升級到 MySQL 5.5.12 並且現在 MySQL 無法啟動”中所說的那樣,您應該:
刪除該指令,您應該會很好。
然后你的配置文件(例如'/etc/my.cnf')應該是這樣的:
[mysqld] collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8
重啟 MySQL。
為了確保您的 MySQL 是 UTF-8,請在您的 MySQL 提示符中運行以下查詢:
第一個查詢:
mysql> show variables like 'char%';
輸出應如下所示:
+--------------------------+---------------------------------+ | Variable_name | Value | +--------------------------+---------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/| +--------------------------+---------------------------------+
第二個查詢:
mysql> show variables like 'collation%';
查詢輸出是:
+----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+
這個問題已經有很多答案了,但 Mathias Bynens 提到應該使用 'utf8mb4' 而不是 'utf8' 以獲得更好的 UTF-8 支持('utf8' 不支持 4 字節字符,字段在插入時被截斷)。 我認為這是一個重要的區別。 所以這里是關於如何設置默認字符集和排序規則的另一個答案。 一個可以讓你插入一堆便便(💩)。
這適用於 MySQL 5.5.35。
請注意,某些設置可能是可選的。 由於我不完全確定我沒有忘記任何事情,我會將這個答案設為社區維基。
mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
# 💩 𝌆
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[mysql]
default-character-set = utf8mb4
mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
character_set_system 總是 utf8 。
這不會影響現有表,它只是默認設置(用於新表)。 以下ALTER 代碼可用於轉換現有表(無需轉儲還原解決方法):
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
編輯:
在 MySQL 5.0 服務器上:character_set_client、character_set_connection、character_set_results、collation_connection 保持在 latin1。 發出SET NAMES utf8
(utf8mb4 在該版本中不可用)也會將它們設置為 utf8。
警告:如果您有一個索引列類型為 VARCHAR(255) 的 utf8 表,在某些情況下無法轉換它,因為超出了最大密鑰長度( Specified key was too long; max key length is 767 bytes.
)。 如果可能,將列大小從 255 減少到191 (因為 191 * 4 = 764 < 767 < 192 * 4 = 768)。 之后,可以轉換表。
在 MySQL 5.5 上,我在 my.cnf 中有
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
結果是
mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
注意: my.cnf 文件位於/etc/mysql/
添加這些行后:
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
不要忘記重新啟動服務器:
sudo service mysql restart
MySQL v5.5.3 及更高版本:
只需在 [mysqld] 部分添加三行:
[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake
注意:在此處包含skip-character-set-client-handshake
可以避免在[mysqld]
包含init-connect
並在[client]
和[mysql]
部分中包含default-character-set
。
NijaCat 很接近,但指定了矯枉過正:
要將默認設置為 UTF-8,您需要在 my.cnf 中添加以下內容
[client]
default-character-set=utf8
[mysqld]
default-character-set = utf8
然后,驗證:
mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
我還發現在[mysqld]
標題下設置default-character-set = utf8
,MySQL 5.5.x 不會在Ubuntu 12.04 (精確穿山甲)下啟動。
在Xubuntu 12.04下我只是添加了
[mysqld]
character_set_server = utf8
到 /etc/mysql/my.cnf
結果是
mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
也看看http://dev.mysql.com/doc/refman/5.6/en/charset-server.html
這里列出的所有設置都是正確的,但這里是最優化和最充分的解決方案:
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci
[client]
default-character-set = utf8
將這些添加到/etc/mysql/my.cnf
。
請注意,由於性能問題,我選擇了utf8_unicode_ci類型的排序規則。
結果是:
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
這是當您以非超級用戶身份連接時!
例如,作為超級用戶和非超級用戶的連接之間的區別(當然在utf8_unicode_ci排序規則的情況下):
具有超級權限的用戶:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | <---
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
具有非超級權限的用戶:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
我寫了一篇綜合文章(rus) 詳細解釋了為什么應該使用一個或另一個選項。 考慮所有類型的字符集和排序規則:用於服務器、數據庫、連接、表甚至列。
我希望這篇文章和這篇文章將有助於澄清不清楚的時刻。
在 Fedora 21 上
$ vi /etc/my.cnf
添加關注:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
保存並退出。
最后記得用service mysqld restart
。
該指令已更改為character-set-system=utf8
http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html
在進行配置時,MySQL 版本和 Linux 發行版可能很重要。
但是,鼓勵在[mysqld]
部分下進行更改。
我想對 tomazzlender 的回答做一個簡短的解釋:
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
[mysqld]
這會將 collation_connection 更改為 utf8_unicode_ci
init_connect='SET collation_connection = utf8_unicode_ci'
使用SET NAMES
:
init_connect='SET NAMES utf8'
SET NAMES 將影響三個字符,即:
character_set_client
character_set_results
character_set_connection
這將設置character_set_database & character_set_server
character-set-server=utf8
這只會影響 collation_database & collation_server
collation-server=utf8_unicode_ci
抱歉,我不太確定這是做什么用的。 但是我不使用它:
skip-character-set-client-handshake
MySQL 5.5,您只需要:
[mysqld]
character_set_client=utf8
character_set_server=utf8
collation_server=utf8_unicode_ci
collation_server
是可選的。
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
如果您在使用 MySQL Workbench 確認客戶端的字符集支持時遇到問題,請記住以下注意事項:
重要MySQL Workbench 打開的所有連接都會自動將客戶端字符集設置為 utf8。 手動更改客戶端字符集,例如使用 SET NAMES ...,可能會導致 MySQL Workbench 無法正確顯示字符。 有關客戶端字符集的其他信息,請參閱連接字符集和排序規則。
因此,我無法使用 my.cnf 更改覆蓋 MySQL Workbench 的字符集。 例如“設置名稱 utf8mb4”
如果您對客戶端的設置感到困惑,並且在重新啟動 mysql 服務后會重置 conn。 嘗試以下步驟(對我有用):
vi /etc/my.cnf
:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
status;
,您會發現“client”和“conn”的字符集設置為“utf8”。查看參考以獲取更多信息。
對於utf8mb4_general_ci
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
collation-server = utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
根據 symfony 框架文檔https://symfony.com/doc/2.6/book/doctrine.html#configuring-the-database
我們不建議使用 MySQL 的 utf8 字符集,因為它不支持 4 字節的 unicode 字符,包含它們的字符串將被截斷。 這是由較新的 utf8mb4 字符集修復的。
你可以按照它的方式進行,如果它不起作用,則需要重新啟動mysql。
更改 MySQL 字符:
default-character-set=utf8
character_set_server=utf8
我們不應該在 mysqld 中寫入default-character-set=utf8
,因為這可能會導致如下錯誤:
開始:作業未能啟動
最后:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.