我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux下mysql字符集问题如何处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux下mysql字符集问题如何处理

小编给大家分享一下Linux下mysql字符集问题如何处理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

4.1之前的 MySQL 不支持多语言,所以它会将你给它的数据“原封不动”地保存,再“原封不动”地读出来。4.1及以后的版本开始支持多语言,这个所谓的多语言,就是在输入输出时 MySQL 会替你做编码转换。而这个转换规则就是由客户端编码和服务器端编码来决定的。编码转换的规则就是,在输入数据时将编码由“客户端编码”转换为“服务器端编码”,输出时将数据由“服务器端编码”转换为“客户端编码”。

MySQL 4.1.x开始支持以下这些事情

  使用多种字符集(Character Set)来存储字符

  使用多种校对规则(Collation)来比较字符串

  在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串

 允许定义任何级别的字符集和校对规则

  MySQL 4.1及以上版本的字符集支持(Character Set Support)有两个方面:字符集(Character Set)和校对规则(Collation)。字符集和校对规则有4个级别的默认设置:服务器(server),数据库(database),数据表(table)和连接(connection)。

MySQL字符集设置

character_set_server:默认的内部操作字符集

character_set_database:当前选中数据库的默认字符集

vi /etc/my.cnf-- 全局选项

[mysqld]

default-character-set=utf8

只能改变对存储层(server,database,table,column,system)的设定,对于客户端和服务器端的通讯层没有任何影响

character_set_client:客户端来源数据使用的字符集

character_set_connection:连接层字符集

character_set_results:查询结果字符集

vi /etc/my.cnf-- 全局选项

[mysql]

default-character-set=utf8

修改当前session值:

SET NAMES 'x'语句与这三个语句等价:

mysql> SET character_set_client = x;

mysql> SET character_set_results = x;

mysql> SET character_set_connection = x;

character_set_system:系统元数据(字段名等)字符集

还有以collation_开头的同上面对应的变量,用来描述字符序。

或者:

CREATE DATABASE db_name DEFAULT CHARACTER SET charset_name;

ALTER DATABASE db_nameDEFAULT CHARACTER SET charset_name;


MySQL中的字符集转换过程

1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;

2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

使用每个数据字段的CHARACTER SET设定值;

若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);

若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;

若上述值不存在,则使用character_set_server设定值。

3. 将操作结果从内部操作字符集转换为character_set_results。

检测字符集问题的一些手段

SHOW CHARACTER SET;

SHOW COLLATION;

SHOW VARIABLES LIKE ‘character%’;

SHOW VARIABLES LIKE ‘collation%’;

SQL函数HEX、LENGTH、CHAR_LENGTH

SQL函数CHARSET、COLLATION

STATUS;

常见问题解析

向默认字符集为utf8的数据表插入utf8编码的数据前没有设置连接字符集,查询时设置连接字符集为utf8

– 插入时根据MySQL服务器的默认设置,character_set_client、character_set_connection和character_set_results均为latin1;

– 插入操作的数据将经过latin1=>latin1=>utf8的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存;

– 查询时的结果将经过utf8=>utf8的字符集转换过程,将保存的6个字节原封不动返回,产生乱码……

向默认字符集为latin1的数据表插入utf8编码的数据前设置了连接字符集为utf8

– 插入时根据连接字符集设置,character_set_client、character_set_connection和character_set_results均为utf8;

– 插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有u0000~u00ff范围以外的Unicode字 符,会因为无法在latin1字符集中表示而被转换为“?”(0×3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。

本次两次测试内容:

环境ed Hat Enterprise Linux Server release 5.5 (Tikanga)LANG=zh_CN.UTF-8

mysql5.0.77

测试一:

Vi/etc/my.cnf

[mysqld]

default-character-set=utf8

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | lantin1 |
| character_set_connection | lantin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | lantin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/

结果:服务器端正常,

在客户端访问WindowXp EMS SQL Manager for my sql是乱码:

测试二:

set names utf8;

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/

测试一中的数据变为乱码,测试二中的数据正常显示。

测试二的数据在客户端数据也正常显示。

如果从客户端插入数据:测试三

在服务器则显示乱码:

测试三:

set names utf8;

set character_set_results=gb2312

insert into test values('测试');

客户端正常,服务器乱码

客户端:

处理乱码的思路:

让服务器端和客户端的字符集保持一致。

服务器端的编码是由字符集(Character Set)和校对规则(Collation)决定的。

  上面提到,MySQL 中是根据下面几个变量确定服务器端和客户端用的什么字符集:

  character_set_client     客户端字符集

  character_set_connection   客户端与服务器端连接采用的字符集

  character_set_results     SELECT查询返回数据的字符集

  character_set_database    数据库采用的字符集

也就是说,只要保证这几个变量采用一致的字符集,就不会出现乱码问题了。

很多情况下,这样设置了之后就能把乱码问题解决了。但是还是不能完全避免出现乱码的可能,为什么呢? 因为character_set_client ,character_set_connection 这两个变量仅用于保证与 character_set_database 编码的一致,而 character_set_results 则用于保证 SELECT 返回的结果与程序的编码一致。例如,你的数据库(character_set_database)用的是 utf8 的字符集,那么你就要保证 character_set_client ,character_set_connection 也是utf8的字符集。而你的程序也许采用的并不是utf8 ,比如你的程序用的是gbk ,那么你若把 character_set_results 也设置为 utf8 的话就会出现乱码问题。此时你应该把 character_set_results 设置为gbk。这样就能保证数据库返回的结果与你的程序的编码一致。

备注:

1、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;

2、要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致;

3、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;

4、要保证程序编码与浏览器编码一致,即程序编码与"/>一致。

更改设定值的一个方法是通过重新编译。如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:--with-charset和--with-collation作为configure的参量。例如:

shell> ./configure --with-charset=latin1

以上是“Linux下mysql字符集问题如何处理”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux下mysql字符集问题如何处理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

linux下mysql字符集如何修改

这篇文章主要讲解了“linux下mysql字符集如何修改”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux下mysql字符集如何修改”吧!修改方法:1、打开并编辑“my.cnf”文件;
2023-06-22

Python处理mysql特殊字符的问题

有的时候我们会去扫表,然后拿出扫的结果再到另一张表里去查信息。比如下面一段index_sql_str = "select %s from user where %s = %d" % ("social_id", "user_id", u_id
2022-05-17

NodeJs超长字符串问题如何处理

本文小编为大家详细介绍“NodeJs超长字符串问题如何处理”,内容详细,步骤清晰,细节处理妥当,希望这篇“NodeJs超长字符串问题如何处理”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题:对于超大的 stri
2023-07-05

linux下发布war所遇问题如何处理

这篇文章给大家分享的是有关linux下发布war所遇问题如何处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 linux启动mysql 由于启动方式不一样 显示也不一样 通过./mysqld_safe &启动
2023-06-13

如何在Python中处理字符串操作的问题

如何在Python中处理字符串操作的问题Python作为一种高级编程语言,具有强大的字符串处理能力。在日常开发中,字符串操作是非常常见的操作之一。本文将介绍如何在Python中高效地处理字符串,同时附带具体的代码示例。字符串的拼接和格式化字
2023-10-22

PHP程序中文字符集处理技巧:解决乱码问题

标题:PHP程序中文字符集处理技巧:解决乱码问题,需要具体代码示例随着互联网的快速发展,中文网站的开发变得越来越普遍。在PHP程序中,处理中文字符集是一个常见的问题,特别是在涉及到数据库操作和页面输出时,经常会遇到中文乱码问题。本篇文章将
PHP程序中文字符集处理技巧:解决乱码问题
2024-03-07

linux中如何实现bash字符串处理

这篇文章给大家分享的是有关linux中如何实现bash字符串处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。取得字符串的长度代码如下:代码:%x="abcd"#方法一%expr length $x4# 方法二%
2023-06-09

linux下如何解决was汉字乱码问题

这篇文章给大家分享的是有关linux下如何解决was汉字乱码问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。linux下was汉字乱码的解决办法:1、登录WAS管理控制台;2、选择“java虚拟机”;3、 设置
2023-06-25

如何解决BufferedReader读取文件指定字符集问题

小编给大家分享一下如何解决BufferedReader读取文件指定字符集问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!BufferedReader读取文件指定字符集问题默认的读取方式BufferedReader buf
2023-06-22

编程热搜

目录