占个坑。

今天在向本机搭建的MySQL数据库插入中文的时候报错了。

使用 show variables like 'char%'; 及 show variables like 'collation%'; 发现许多项是latin。意识到是配置文件的问题。

去找配置文件的时候,竟然没找到配置文件(记得以前配置过的,难道删了?)。然后看 mysql.server 这个脚本,发现my.cnf 配置文件除了可以放到 /etc 下之外还可以放到用户的家目录,还可以放到安装的位置 /usr/local/mysql。为了目录规整,于是决定放到安装的位置下。

将配置文件加入如下内容:

[client]
character-set-client=utf8mb4 [mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci [mysql]
default-character-set=utf8mb4

这段内容是当初配置的时候从stackoverflow中找到的,稍微修改了一下。stackoverflow中问题的位置(https://stackoverflow.com/questions/3513773/change-mysql-default-character-set-to-utf-8-in-my-cnf),采用的是一个在配置文件中加入便便emoji的人的答案。

暂时没有去翻mysql的文档以清楚这些配置项代表什么。

下面说一个怪异的行为:

当我使用mysql命令连接到数据库之后,使用上文提到的两条show语句,发现配置是生效的。但是当我尝试插入中文时,依然报错。回头使用show 命令查看配置的时候,发现 character_set_database 和 collation_database 这两项又变成了latin。试过几次依然是同样的情况。

后来突然想到可能是数据库也设置了编码,使用mysql workbench查看对应的表的编码,果然是latin,然后查看对应的库的编码,也是latin。

现在已经修改配置文件了,重新创建一个新的数据库时,编码方式已经是utf8mb4了。

现在问题成了如何修改已有的数据库的默认字符集。

通过查看MySQL手册(https://dev.mysql.com/doc/refman/5.7/en/alter-database.html)得知,可以这样:

alter database <db_name> character set utf8mb4

alter database <db_name> collate utf8mb4_unicode_ci

改完数据库的默认编码之后,数据库里原先创建的表的编码还没修改呢,修改表的编码方式与修改数据库的编码方式类似,无非就是将database换成table,将<db_name>换成<table_name>

发现改完表之后,表中的已有字段的字符集还是latin,修改字段这个与前两个不太一样,使用以下语句:

alter table <table_name> change <column_name> <column_name> <column_type> character set utf8mb4;

经过这一系列修改之后,终于可以插入中文了。

为了避免修改的问题,最好在最初搭建数据库的时候就将字符编码配置好。

还遗留了许多问题需要明确,比如,配置文件中的collation代表了什么?配置文件应该怎么写最合适?字符集的配置在数据库/表/字段 之间是如何的继承关系?

MySQL编码问题探究的更多相关文章

  1. mysql编码的那点事

    Mysql编码问题  在php页面可以向mysql插入英文字符,但就是不能插入中文字符,在cmd客户端也可从插入,这是困扰我两天的问题. 在网上找了很多资料,最终确定了是字符编码这个地方出现了问题,首 ...

  2. Linux(Ubuntu)使用日记------Mysql编码(utf-8)的设置

    Mysq版本:5.7.21 操作系统:Linux(Ubuntu) 整个操作的基本思路如下(包括问题的解决思路,想要直接解决问题的可以先看最后的命令总结) 检查mysql编码 找到Mysql的配置文件 ...

  3. php mysql 编码问题

    php mysql 编码问题 问题: PHP从数据库中读取数据,并echo出来,数据中文显示正常:但是echo出新定义的中文字符串,新定义的字符串会乱码. 由此可能是数据库中提取出来的中文编码和php ...

  4. linux上设置mysql编码

    linux下设置mysql编码 linux下设置mysql编码 首先查找MySql的cnf文件的位置: [root@flyHome gaoxiang]# find / -iname '*.cnf' - ...

  5. MYSQL进阶学习笔记一:MySQL编码设定,会话变量和全局变量!(视频序号:进阶_1-3)

    知识点一:MySQL编码设定(1-2) 服务器编码设定: 查看MySQL服务器端的编码格式: SHOW VARIABLES LIKE ‘char%’; 设定编码格式: SET NAMES ‘utf8’ ...

  6. 关于mysql编码问题

    1 查看MySQL编码 SHOW VARIABLES LIKE 'char%';

  7. 配置mysql 编码

    配置mysql 编码 [client]default-character-set=utf8mb4 default-storage-engine=INNODB [mysql]default-charac ...

  8. mac mysql 编码配置

    mac mysql 编码配置 (mysql目录下没有my.cnf) 想要修改编码发现自己的/usr/local/mysql/support-files里面根本没有my.cnf 安装方式是去mysql官 ...

  9. 【他山之石】mysql编码问题总结

    有些问题可能比较基础,但是没有经过系统学习还是可能会出错,记录下. 这次是mysql的编码问题. 背景是部署新的测试环境,给了一台服务器还有在另一个环境下的mysql,配置过程中发现mysql编码有问 ...

随机推荐

  1. [未解决:快速滑动collectionveiw请求数据崩溃]:unable to allocate 6553600 bytes for bitmap data

    崩溃:unable to allocate 6553600 bytes for bitmap data

  2. 转:SAX解析的characters方法被多次调用

    原文地址:https://blog.csdn.net/liuxiaoddd/article/details/28885177 android SAX解析的characters方法被多次调用 同理 试用 ...

  3. Python开发【笔记】:获取目录下所有文件

    获取文件 import os def sub_dirs(rdir): li = os.listdir(rdir) return li def main(rdir): content = sub_dir ...

  4. Python一个文件调用另外一个文件的方法

    from common.Log import MyLog as Log 写法不完善修改为 import common.Log.MyLog as Log 即可

  5. TZOJ 5225: 玩转二叉树

    描述 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入 输入第一行给出 ...

  6. jq优化

    1.使用链式写法 $('div').find('h3').eq(2).html('Hello');采用链式写法时,jQuery自动缓存每一步的结果,因此比非链式写法要快.根据测试,链式写法比(不使用缓 ...

  7. jquery中$.get()提交和$.post()提交的区别

    相同点:都是异步请求的方式来获取服务器端的数据: 异同点: 1.请求方式不同:$.get()方法使用 GET 方法来进行异步请求的:$.post()方法使用POST方法来进行异步请求的: 2.参数传递 ...

  8. ZedBoard上运行linux系统的准备工作框架

    目标:ZedBoard上运行linux系统. 需要什么:图中上色部分. 应该做哪些工作:上色部分之前的所有步骤. 由上图得知,为了顺利在zedboard上构建嵌入式Linux操作系统,我们一般需要如下 ...

  9. 【SQL】from a,b。表a 和b之间是什么关系?

    1.select a.id from a,b……——>这里a和b用逗号隔开,a,b之间默认是inner join的关系.

  10. linux md5sum命令

    md5sum命令用于生成和校验文件的md5值 生成文件md5值 [root@cdncenter ~]# ll total -rw-r--r-- root root Oct : .txt -rw-r-- ...