-
字符编码,不仅数据库的数据表有字符编码,我们使用的管理数据库的客户端工具也有字符编码,甚至说后者的编码比数据表本身的编码更为重要。
-
数据库是只管存数据的,是什么也许它并不关心,你给我什么我就存什么。比如,当一个数据库表的编码格式是“ CHARSET=latin1”;那么它能影响到什么呢?
-
举个例子,如果一个字段grade的数据类型是char(6),char(n)数据类型的n本来是指字符的个数的,而且一旦指定n,其空间大小是分配好的。也就是说char(6),按道理讲,不管你是英文字符还是汉字字符,它都能存进去6个字符,比如“abcdef”和“一二三四五六”。结果我尝试插入“一年级”三个字,它只能存放“一年”这两个字,第三个字被截掉了,这是怎么回事?
-
原因是我们数据库表的字符编码格式是“ CHARSET=latin1”,这种格式1个字符只占1个字节,而且只有英文和数字以及一些符号的编码,所以当我们使用char(6)的时候,mysql软件实际上只给该字段分配了6个字节的存储空间。当我们用命令客户端连接并操作数据库的时候,这个客户端的字符编码是UTF-8(字符编码可以设置),所以在客户端上能正确打出并显示“一年级”这3个汉字,但是这3个汉字在UTF-8格式下是每个汉字占用3个字节,一共9个字节的。所以当我们的命令传入数据库服务器后,第三个汉字“级”的所有字节因为存储空间不够被截掉了,就只剩下了“一年”两个字符的6个字节的数据被保存进了数据库表。
-
当我们在客户端查询,再次从数据库表中取出那个字段的数据,只能取出那6个字节的数据,所以传递到我们客户端显示的时候,因为客户端是UTF-8编码格式的,所以能正确显示汉字,但也只能显示“一年”那两个字了。
-
所以,我们不管是在查询还是插入数据库数据的时候一定要保证数据库表的编码格式和和我们使用的管理客户端的编码格式要一致,一般都使用utf8(这样mysql数据库就会给char(6)分配6*3=18个字节的空间),否则就会容易出现问题。
下面具体说说,编码格式的配置问题
image.png
-
如果是已经登录了,可以使用set names 字符集(会话级别临时修改,重新登录会失效);命令来实现上述效果,等同于下面的命令:
set character_set_client = 字符集
set character_set_connection = 字符集
set character_set_results = 字符集
如果碰到上述命令无效时,也可采用一种最简单最彻底的方法就是修改配置文件。 -
set names xxx命令是一次性统一修改character_set_client、character_set_connection和character_set_results的字符集(注:除了这三项要保证一致外,要想在客户端正确显示和输入,还要保证客户端工具的编码配置和数据库的character_set_client一致才可以,因为character_set_client只表示数据库服务将处理结果传给客户端的编码格式,所以客户端工具的显示编码格式要和此项匹配才能正确解析和显示)
https://blog.csdn.net/wqh0830/article/details/86476700
网友评论