问题:
Mysql图形用户工具sqlyog,eclipse中执行sql语句(插入语句)插入数据库表格的字符串在sqlyog的表格中显示为“?”问号。(提示:插入语句中的字段name是赋值为字符串”张三”,表中显示“??”)。
之所以会出现这个问题,主要是没有设置好合适的字符集类型。
首先我们要清楚一点,即所下载的Mysql服务器它本身就有默认的字符集编码类型。
查看mysql服务器的字符集类型,通过命令行输入命令:
mysql
进入mysql命令行,如图:
再输入查看数据库字符集类型的命令:
show variables like ‘character%’;
如图中的character_set_database(客户端)的字符集和character_set_server(服务端)的字符集类型为latin1(即字符编码类型为拉丁字1,这是mysql默认的)。
“Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。”——引自百度百科。
从百度百科的解释中我们可以很清楚地了解到latin1编码方式收录的字符并不包括汉字语言的。
因此,若我们想要通过eclipse等的编辑器执行DML语句(即insert、update、delete这类sql语句)去影响表格里的汉字信息,比如像问题里的往表格里插入张三且正常显示,则可以按照以下的步骤:
一、修改mysql服务器的服务端和客户端的字符编码方式
1、我的电脑->属性(服务)->mysql(mysql服务名称)右键->属性->停止服务
2、进入Mysql文件的根路径->my.ini
修改[mysqld]下的character-set-server=utf8
3、启动mysql服务!
查看重新设置了字符集类型的mysql的字符集信息,如下图:
可看到character_set_database和character_set_server的字符集类型变成utf8了。
二、设置好eclipse编辑器的字符集类型
菜单栏中:File->properties
三、设置好数据库和数据库表格的字符编码方式
如果你是在图形化管理MYSQL数据库的工具里创建数据库和表格的,例如我是用sqlyog;
设置好数据库和表格的字符集,排序规则。
如果你通过执行sql语句建立数据库和表格的,sql可以这么写:
Mysql创建数据库并设置字符集和排序规则:
create database {database name} CHARACTER SET utf8 COLLATE utf8_general_ci
CHARACTER : 字符集(多数情况下要选择一个支持中文的字符集)
COLLATE : 排序规则,一般来说每种CHARSET都有多种它所支持的COLLATE,并且每种CHARSET都指定一种COLLATE为默认值。例如Latin1编码的默认COLLATE为latin1_swedish_ci,GBK编码的默认COLLATE为gbk_chinese_ci,utf8mb4编码的默认值为utf8mb4_general_ci Case Insensitive——引自 博客园 Copyright © 2021 xiaofei01gm
Mysql创建表格并设置字符集和排序规则:
CREATE TABLE 表名(列名1 数据类型,列名2 数据类型)CHARACTER SET utf8 COLLATE utf8_general_ci
例如:创建一个表名为people的表格
CREATE TABLE people(id int,name varchar(50))CHARACTER SET utf8 COLLATE utf8_general_ci
至此,通过sql语句(插入语句)插入数据库表格的字符串在图形化管理MYSQL数据库的工具sqlyog里的信息表中显示为“?”问号这个问题就解决啦!
我们可以来分析一下为什么一开始‘张三’在信息表里面显示的是‘??’,
通过下面这个式子应该能迅速弄明白
Utf8>latin1>ascll
上面是三个字符集所包括的字符范围大小的关系,‘张三’是汉字字符,utf8认识它,但是latin1不认识它,所以显示‘??’,我试过将eclipse的字符集设置为latin1,此时汉字都变成了乱码,但是执行完sql插入语句之后,信息表格里面的信息与乱码内容完全一样,也就是说utf8认识这些乱码,所以不会显示为‘?’。
这个是题外话,已解决问题的小伙伴可以一起讨论。