将character_set_client的值设置为utf8mb4


12

我正在尝试将我的数据库转换为utf8mb4遵循本指南。我已经设定:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip-character-set-client-handshake

但价值character_set_clientcharacter_set_results仍然不会改变utf8mb4。

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

我究竟做错了什么?如何将这些值设置为utf8mb4?

Answers:


14

披露:我是《如何在MySQL数据库中支持完整Unicode》的作者,您正在遵循的指南。

  1. 您将修改后的设置保存在哪里?检查从何处mysqld加载默认选项。通常是/etc/my.cnf如本指南中所述),但是在您的系统上可能有所不同。运行以下命令以查找:

    $ mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
  2. 进行更改后,是否mysqld通过运行重新启动mysqld restart


1.我将更改保存在中\xampp\mysql\bin\my.ini。我无法运行mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'-因为它出现以下错误:'grep' is not recognized as an internal or external command, operable program or batch file.我是这个东西的新手,所以我可能做错了什么。
qwaz 2014年

2.我确实重新启动了mysqld,然后它给了我以下警告:2014-02-19 10:25:17 0 [警告]不建议使用唯一选项前缀character_set_client而不是character-set-client-shake,并将其删除在将来的版本中。请改用全名。2014年2月19日10时25分十七秒0 [警告]的mysqld:忽略选项“--character-设定客户握手”由于无效值“utf8mb4”
qwaz

1
为什么skip-character-set-client-handshake您的配置文件中有?这是命令行选项,而不是变量。
Mathias Bynens 2014年

1
我不得不重新安装本地服务器;再次浏览了您的指南,一切顺利。感谢您的回复和帮助。如果有足够的代表,我会尽快回复您的答复并投票支持。
qwaz 2014年

3
我试过,但还是character_set_clientcharacter_set_connectioncharacter_set_resultscollation_connection如图utf8。任何想法为什么这不起作用?
Sarita

2

我也遵循了该指南,但是,同样的问题再次出现。实际的问题在于用于创建数据库的命令,因为该命令将其DEFAULT CHARACTER作为参数,如果在执行过程中未传递该参数,则会传递缺省字符集,而不是utfmb4

以下是我修复该问题的步骤:

  1. utf8mb4字符集创建一个虚拟数据库。

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  2. 将实际结构和数据从实际数据库复制到此虚拟数据库

    mysqldump -uroot -proot_password your_db_name | mysql -uroot -proot_password your_db_name_dummy

  3. 删除当前数据库

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
  4. 建立新资料库

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  5. 最后,将表结构和数据放回原始数据库

    mysqldump -uroot -proot_password your_db_name_dummy | mysql -uroot -proot_password your_db_name

如果要使用上述过程,请确保也仔细阅读以下提到的行。

先决条件和我的现状:

  • 备份您的所有结构,数据,存储过程,函数,触发器等。
  • mysql --version 适用于Linux(x86_64)的mysql Ver 14.14 Distrib 5.7.22,使用EditLine包装器

  • cat /etc/my.cnf

    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    init-connect = 'SET NAMES utf8mb4
    collation-server = utf8mb4_unicode_ci
  • 我正在使用Java客户端 'mysql:mysql-connector-java:5.1.30'

  • 我的连接字符串是 jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
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.