簡體   English   中英

在my.cnf中將MySQL默認字符集改成UTF-8?

[英]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 無法啟動”中所說的那樣,您應該:

  1. 刪除該指令,您應該會很好。

  2. 然后你的配置文件(例如'/etc/my.cnf')應該是這樣的:

     [mysqld] collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8
  3. 重啟 MySQL。

  4. 為了確保您的 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、collat​​ion_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]

這會將 collat​​ion_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

這只會影響 collat​​ion_database & collat​​ion_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。 嘗試以下步驟(對我有用):

  1. vi /etc/my.cnf
  2. 添加內容吹和:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  3. 重啟mysql並登錄mysql,使用數據庫,輸入命令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

mysqld

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM