在my.cnf中将MySQL默认字符集更改为UTF-8吗?


334

当前,我们在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

这是解决这个问题的正确方法吗?


19
请注意,更好的默认设置是utf8mb4,即具有完全Unicode支持的真实UTF-8。请参阅如何在MySQL数据库中支持完整Unicode
Mathias Bynens 2012年

@Jorre您是否愿意更改此utf8mb4设置,因为这是一种设置危险先例的好方法?
埃文·卡罗尔

Answers:


424

要将默认设置为UTF-8,您需要将以下内容添加到my.cnf

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

如果您想更改现有数据库的字符集,请告诉我...您的问题没有直接指定,因此我不确定这是否是您想要的。


18
上面的my.cnf设置也对我有用。另外,我必须确保正确设置了表,例如ALTER TABLE TableCONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
克里斯·利夫达尔

8
不适用于mysql 5.5。我用过:<br/> [mysqld]#utf-8 collat​​ion-server = utf8mb4_unicode_ci init-connect ='SET NAMEs utf8mb4'character-set-server = utf8mb4和utf8mb4的更改,如上所述。
2012年

12
在Ubuntu 12.04上,这对我有用-如果我删除了之后的第一行[mysqld]
布兰登·贝特尔森

4
看起来[mysqld]节中不再允许使用default-character-set设置
marsbard 2013年

4
请注意,如果您要使用UTF-8,请不要使用MySQL的utf8字符集。使用utf8mb4代替。
Mathias Bynens 2014年

255

对于最新版本的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 |
       +----------------------+-----------------+

您的第一行max_allowed_pa​​cket = 64M是否与该UTF8问题相关?
malhal 2012年

我有character_set_filesystem | utf8。我不确定,可以吗?
Lem叔叔

1
在MariaDB v5.5上尝试过,它可以工作,谢谢!mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
cenk 2014年

我认为您不需要删除default-character-set,而是可以更改为loose-default-character-set = utf8-即前缀为'loose-'。mysqlbinlog如果您需要使用它,这会很高兴-google for:“ loose-default-character-set” mysqlbinlog
KajMagnus 2014年

是否init-connect='SET NAMES utf8'真的有必要?如果没有,我们绝对可以没有它来提高性能。
datasn.io 2014年

56

这个问题已经有很多答案,但是Mathias Bynens提到,为了更好地支持UTF-8,应使用'utf8mb4'而不是'utf8'('utf8'不支持4字节字符,插入时字段会被截断)。我认为这是一个重要的区别。因此,这是有关如何设置默认字符集和排序规则的另一个答案。一个可以让您插入一堆便便(💩)的地方。

这适用于MySQL 5.5.35。

请注意,某些设置可能是可选的。由于我不能完全确定自己没有忘记什么,因此我将把这个答案作为社区Wiki。

旧设定

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。


警告:如果您有一个utf8表,其索引列的类型为VARCHAR(255),则在某些情况下无法转换该表,因为超过了最大密钥长度(Specified key was too long; max key length is 767 bytes.)。如果可能,请将列大小从255减小到191(因为191 * 4 = 764 <767 <192 * 4 = 768)。之后,可以转换表。


我跟着您的设置,但我觉得character_set_database还是utf8collation_database为utf8_bin`。我错过了什么?
斯图尔特

找到我想念的。创建数据库本身时将设置这两个设置。看到这个问题;stackoverflow.com/questions/22572558/…–
斯图尔特

1
添加character-set-client-handshake = FALSE到[mysqld]部分,因此即使您在应用程序层出错,它也将始终使用默认编码
Lukas Liesis

您好,我尝试过此解决方案,但仍然无法显示character_set_client | utf8mb4。是utf8。只是character_set_database utf8mb4和character_set_server utf8mb4是utf8mb4,其他未更改。请帮助我
Bhavin Chauhan

@ baic6我建议添加一条注释,以阐明为什么只有索引列会导致此问题。767字节限制仅适用于索引列,即“键”的限制。通常,对于非索引列,这并不适用。如果列的值具有最大字节长度(例如255个字符)并且使用了utf8的最大3个字节,则该列仍将仅需要255 * 3字节,在这种情况下utf8mb4将仅使用3个字节,因为utf8mb4中的这些字符也只需要3个字节。也就是说,除非将不适合utf8的字符存储到该列中,否则这种情况下信息已经丢失。
sam,

55

在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)

2
这是什么skip-character-set-client-handshake做的正是下需要什么情况呢?
西蒙·伊斯特

3
@Simon,使用时show variables like "%collation%";我看到的是'collat​​ion_connection' utf8_general_ci和collat​​ion_database和collat​​ion_server utf8_unicode_ci。添加该行skip-character-set-client-handshake会将常规条目更改为unicode,因此所有这三个都是一致的。
沃尼2012年

2
在MySQL 5.6上,skip-character-set-client-handshake不执行@Vaughany所说的。有什么建议吗?
Ababneh 2012年

4
skip-character-set-client-handshake为我做(与“字符集-服务器”和“整理服务器”,当然一起-在Debian 7)。使用init_connects或不使用s都不会造成影响,skip并且似乎是多余的。+1,谢谢。
Jeff

3
skip-character-set-client-handshake忽略客户端发送的字符集信息。在通信过程中强制使用特定的字符集是很好的方法,但是如果客户期望其他内容,则可能导致问题。我想您最好在客户端(您的应用程序)上指定它。
0b10011 2014年

31

注意: 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

2
注意:这将更改默认值;它并没有改变编码的任何现有列。
里克·詹姆斯

24

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)

5
好答案。简要说明哪些部分过大可能会帮助人们确定自己想要的配置。
Mike Samuel

@Derek,那怎么[mysql] default-character-set=utf8办?
Pacerier,2014年

1
[client]选项组已经为所有读取my.cnf文件的MySQL客户端设置了选项。[mysql]组专门为“ mysql”客户端二进制文件设置选项。如果要设置一个不适用于其他客户端的mysql选项,则使用该组是合适的,但是在两个位置都设置相同的选项值是多余的。 dev.mysql.com/doc/refman/5.6/en/option-files.html
Derek,

@Mike Samuel,将默认字符集设置为utf8已经暗示了utf8_general_ci的默认整理模式。另一方面,“ init-connect ='SET NAMES utf8'”是一个有趣的主意,因为它试图强制所有连接到服务器的客户端使用utf8,但这取决于连接的连接权限不一致地应用。用户和我怀疑,当服务器覆盖他们请求的字符集时,某些连接的第三方客户端可能会感到困惑。 dev.mysql.com/doc/refman/5.6/en/charset-applications.html
Derek,

对于[mysqld]使用character-set-server代替default-character-set
里克·詹姆斯


22

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这里省却了包括init-connect[mysqld]default-character-set[client][mysql]节。


1
哇,这个问题有很多重复的答案,但这似乎是最简单的答案。在v5.5.44上也适用于我。
贾斯汀·瓦特

9

在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


您还需要[client] default-character-set = utf8,否则,当您在命令行上使用mysql时,它将不会使用utf8,这可能会破坏管道传输到文件的所有备份。
malhal 2012年

9

此处列出的所有设置都是正确的,但以下是最佳和充分的解决方案:

[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 |
+----------------------+-----------------+

这是当您以非SUPER用户身份连接时!

例如,以超级用户和非超级用户的连接之间的区别(当然是在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 |
+----------------------+-----------------+

具有非SUPER特权的用户:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

我写了一篇详尽的文章(rus),详细解释了为什么应该使用一个或另一个选项。考虑所有类型的字符集排序规则:对于服务器,对于数据库,对于连接,对于表,甚至对于列。

我希望这一点和本文将有助于澄清不清楚的时刻。


3
我希望我能阅读您的链接文章,但不会阅读俄语,而Google翻译对技术性文字没有帮助。从我可以看出,这将非常有趣。您可以考虑发布英文版吗?
Martijn Heemels,2013年

2
您能解释一下哪个设置无法设置超级用户连接排序规则吗?(并且有解决方案)
KCD

@gahcep,您说过您utf8_unicode_ci由于性能问题而使用它,那为什么不使用它utf8_bin呢?
Pacerier,2014年

嗨,Paceriar。好点子。现在我不确定我的选择是否正确utf8_unicode_ci。从未花时间测试性能。
gahcep 2014年


4

进行配置时,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

文档指出character_set_server不应手动设置。
Brian

那么什么是最先进的方法?character set建立数据库连接时,我们可以显式传递,但是看起来有些烦人。
Lihang Li 2013年

实际上我犯了一个错误。文档说character_set_database不应动态设置。没有提及character_set_server。但是,我不确定您是否需要担心character_set_server,因为我认为这只会影响新创建的数据库的默认值?
布赖恩

正如我上面提到的,我刚才又做了一次实验,character_set_server[mysqld]部分将影响character_set_databasecharacter_set_server。现在,我认为一种好的做法是明确指出character set要在创建数据库,表和数据库连接时使用的对象。老实说,的文档mysql不那么容易理解。你知道,如果有一个通用的方法来获取所有character set,并collation在mysql中完成的设置?
Lihang Li 2013年

4

在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

保存并退出。

最后记得用重启服务mysqld service mysqld restart


1

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)

1

如果您在使用MySQL Workbench确认客户端的字符集支持时遇到麻烦,请牢记以下注意事项:

重要事项 MySQL Workbench打开的所有连接都会自动将客户端字符集设置为utf8。手动更改客户端字符集,例如使用SET NAMES ...,可能会导致MySQL Workbench无法正确显示字符。有关客户端字符集的其他信息,请参见连接字符集和排序规则。

因此,我无法通过my.cnf更改覆盖MySQL Workbench的字符集。例如“设置名称utf8mb4”


1

如果您对客户端的设置感到困惑,并且在重启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'。

检查参考以获取更多信息。


0

您可以按照它的方式进行操作,如果它不起作用,则需要重新启动mysql。


-1

更改MySQL字符:

客户

default-character-set=utf8

mysqld

character_set_server=utf8

我们不应该default-character-set=utf8用mysqld 编写,因为那样可能会导致如下错误:

开始:作业无法开始

最后:

 +--------------------------+----------------------------+
 | 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/ |
 +--------------------------+----------------------------+
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.