如何将数据库utf8编码修改为utf8mb4编码?

By 李战

2021-09-20 23:14:05

浏览量544

已赞0

Warning: #1366 Incorrect string value: '\xF0\x9F\x98\x81' for column 'author' at row 1

插入的时候报这个错误

原因是创建数据库的时候,选的是utf-8而不是urt8m64

网上有很多这样的教程,如何修改。本地的话可以参考:

https://blog.csdn.net/hzw19920329/article/details/55670782

但是呢,我是在宝塔搞得服务器,上述修改的方法就不是很到位了。

记录一下:

点击操作修改数据库的编码格式

Image

接着点击每个表,同样的点击操作进行修改

最后修改每个表每个字段的

Image

在修改过程中,有可能报错

create table: Specified key was too long; max key length is 767 bytes

进行下面操作,要root进入:

Image

这样就可以保存表情了。


发表评论
请先 注册/登录 后参与评论

已有3 发布

默认   热门   正序   倒序
  • 4F
    李战2021-09-21 00:29:33   
    阿里云的服务器,phpmyadmin怎么都进不去,安装了两个不同的版本测试也不行,实在没有办法,只能使用命令行进行操作了:

    Image

    1、使用宝塔自带的终端进行命令行操作,连接数据库,使用命令:

    mysql -h 127.0.0.1 -uroot -p数据库名称

    【在进行数据库连接的时候,我在使用命令的时候,-u和用户名以及-p和密码之间都添加了一个英文空格,怎么都连接不成功,最后把空格去掉了,才连接上数据库】;

    可以使用命令  show charset; 查询服务器支持的编码格式; 

    【在使用数据库命令的时候,每个命令的结尾一定要添加一个英文的分号,否则会将多行命令当作一个命令来执行,容易出错】; 

    Image

    2、使用命令查看数据库目前的字符集配置

    show variables like '$character%'; 

    Image

    3、使用命令use选择操作的数据库

    use 数据库名称

    使用alter命令修改数据表的字符集

    alter table 表名 convert to character set 新的字符集;

    我的数据库字符编码是utf-8,编码本身是没有问题的,但是,在发布的一些文章中,如果使用了emoji表情符号就无法发布,需要将数据库的字符编码修改为 utf8mb4 格式,按照这种方式修改就可以支持了。

    0
  • 2F
    李战2021-09-20 23:16:04   

    utf8mb4兼容utf8,且比utf8能表示更多的字符,是utf8字符集的超集。所以现在一些新的业务,比如ISO等,会将MySQL数据库的字符集设置为utf8mb4。

    今天在处理一个应用需求的时候,就遇到这样一个问题:

    当然调整的最好方法是客户端,mysql数据库的字符集都修改为utf8mb4,但这样修改量比较大,而且如果客户端一部分修改为utf8,一部分为utf8mb4的话,容易发生混乱。

    经过几次测试后,MySQL数据库的my.cnf中关于字符集的配置修改为下面的配置了:

    [client]
        default-character-set=utf8mb4
        [mysqld]
        character-set-server = utf8mb4
        collation-server = utf8mb4_unicode_ci
        init_connect='SET NAMES utf8mb4'
        skip-character-set-client-handshake = true
        [mysql]
        default-character-set = utf8mb4

    其中collation-server 这些设置为utf8mb4字符集是比较容易理解的,就是将MySQL数据库相关的字符集都设置为utf8mb4;

    init_connect='SET NAMES utf8mb4' 表示初始化连接都设置为utf8mb4字符集,再配置一个 

    这些参数在my.cnf配置好后,重启mysql实例让设置生效,应用人员经过各种测试后,确认满足字符集要求,各方面正常。


    0
  • 3F
    李战2021-09-20 23:17:59   

    字符序命名规则

    字符序是以对应的字符集名称开头、以_ci(不区分大小写)、_cs(区分大小写)、_bin(按编码值比较,区分大小写)等结尾。字符序的作用就是每种不同的字符集在比较时采用的不同的方法,例如:当会话的collation_connction设置为utf8_general_ci字符序时,字符a和字符A是等价的,而当其设置为utf8_bin时,字符a和字符A是不等价的。具体信息请参见下图示例。

    字符编码相关参数

    查看相应数据库的字符集,具体操作如下:

    1. 登录RDS实例,请参见连接MySQL实例
    2. 在目标库中执行以下SQL语句,查看相应数据库的字符集。

      show variables like '%character%';

      系统显示类似如下。

      说明
      • 以上参数必须保证除了character_set_filesystem以外的值相同,才不会出现乱码的情况。
      • character_set_client、character_set_connection以及character_set_results是客户端的设置。
      • character_set_system、character_set_server以及character_set_database是服务器端的设置。
      • 服务器端的参数优先级是character_set_database > character_set_server > character_set_system。
      • character_set_system参数在控制台上暂时不提供更改,但是由于其优先级最低,因此影响不大。修改了客户端字符集、character_set_database、character_set_server之后基本上可以保证不会出现乱码,在代码中设置客户端字符编码时建议通过set names [$Character_Set]来修改客户端的设置。[$Character_Set]为需要设置的字符集。

    字符集相关SQL语句

    show global variables like '%char%';                                  #查看RDS实例字符集相关参数设置
    show global variables like 'coll%'; #查看当前会话字符序相关参数设置
    show character set; #查看实例支持的字符集
    show collation; #查看实例支持的字符序
    show create table [$Table_Name]; #查看表字符集设置
    show create database [$Database_Name]; #查看数据库字符集设置
    show procedure status; #显示数据库中所有存储过程的基本信息
    show create procedure [$Procedure_Name]; #显示某一个存储过程的详细信息
    alter database db_name default charset utf8; #修改数据库的字符集
    create database db_name character set utf8; #创建数据库时指定字符集
    alter table tab_name default charset utf8 collate utf8_general_ci; #修改表字符集和字符序

    说明

    • [$Table_Name]为需要表名。
    • [$Database_Name]为库名。
    • [$Procedure_Name]为存储过程的名称,一般会配合show procedure status;使用。

    示例如下图所示。

    修改字符集

    说明:由utf8修改为utf8mb4字符集不会影响之后的数据质量,且已经存在的数据也不受影响,但是数据存储空间会有所增加。

    控制台上修改字符集参数

    如何修改character_set_server参数,请参见设置实例参数

    使用SQL语句修改数据库字符集

    修改列时,当前列中的所有行都会立即转化为新的字符集。alter table会对表加元数据锁(metadata lock), 详情请参见RDS MySQL表上Metadata lock的产生和处理

    • 修改库:ALTER DATABASE [$Database] CHARACTER SET [$Character_Set] COLLATE [$Collation_Name];
      说明
      • [$Database]为数据库的库名。
      • [$Character_Set]为字符集名称。
      • [$Collation_Name]为排序规则名称,即字符序。
    • 修改表:ALTER TABLE [$Table] CONVERT TO CHARACTER SET [$Character_Set] COLLATE [$Collation_Name];
      说明:[$Table]为表名。
    • 修改列:ALTER TABLE [$Table] MODIFY [$Column_Name] [$Field_Type] CHARACTER SET [$Character_Set] COLLATE [$Collation_Name];
      说明
      • [$Column_Name]为字段名。
      • [$Field_Type]为字段类型。

    如下SQL语句所示,分别将dbsdq库、tt2表、tt2表中的c2列修改为utf8mb4字符集。

    alter database dbsdq character set utf8mb4 collate utf8mb4_unicode_ci;
    use dbsdq;
    alter table tt2 convert to character set utf8mb4 collate utf8mb4_unicode_ci;
    alter table tt2 modify c2  varchar(10) character set utf8mb4 collate utf8mb4_unicode_ci;

    使用Navicat修改数据库字符集

    • 修改库:
      使用Navicat连接数据库,选择连接的名称,右键单击库的名称,单击编辑数据库,在字符集右侧选择需要的字符集,单击确认即可。
    • 修改表:
      右键单击对应的表,单击设计表,然后单击选项,在字符集右侧选择需要的字符集,单击保存即可。
    • 修改字段:
      单击字段,选择对应的字段,选择需要的字符集,单击保存即可。
    0
查看更多评论