占个坑。

今天在向本机搭建的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. JavaScript面向对象之创建类和方法

    一,js使用函数来定义类而不是像别的编程语言一样通过关键字class来定义,通过类本身(this)和原型(prototype)来完成面对对象编程! 示例1, //创建ElectronicSignatu ...

  2. zabbix zatree centos7安装zabbix-agent

    https://github.com/Emersonxuelinux/zatree-3.0-/tree/master/zabbix-3.0.x /bin/sh /config/ds.sh /tmp/z ...

  3. LeetCode 929 Unique Email Addresses 解题报告

    题目要求 Every email consists of a local name and a domain name, separated by the @ sign. For example, i ...

  4. Appium入门(9)—— Appium API

    摘自:http://www.testclass.net/appium/appium-base-api-01/ 1.安装: installApp() driver.installApp("d: ...

  5. falsk 与 django 捕获异常

    falsk捕获异常@app.errorhandler(405)def internal_server_error(e): return '这个接口不能被GET请求到,只能post' django 捕获 ...

  6. golang 死锁

    golang中for{}会引起程序死锁 如: main(){ go func(){fmt.Println("dfkdsf")} for{ } } 程序运行一会会停止 按照下面的写法 ...

  7. 【PyQt5-Qt Designer】液晶显示屏(QLCDNumber)

    液晶显示屏(QLCDNumber) 总体介绍 QLCDNumber小部件显示一个类似LCD的数字. 它可以显示任何大小的数字.它可以显示十进制,十六进制,八进制或二进制数字.使用display()槽连 ...

  8. FTP主动模式和被动模式的区别(转)

    dd by zhj: 一般使用被动模式,在命令行下,被动模式的格式是:ftp -p (yinservice_env) ajian@ubuntu-desk:~$ ftp -pftp> 之前在用命令 ...

  9. Python字符串拼接的6种方法

    如有其他字符串拼接方法 欢迎留言提出哦 (示例版本为Py2) 1. 加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接用 “+” 来连接两个字符串 ...

  10. Servlet----------在使用doGet()和doPost()是如何处理中文乱码

    如果在登录界面跳转到时servlet中使用doGet()方法显示中文出现乱码时,可以添加这两行代码来解决,但这不是唯一的方法 request.setCharacterEncoding("GB ...