免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2934 | 回复: 5
打印 上一主题 下一主题

Mysql在linux下和windows下的关于字符集的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-07 22:29 |只看该作者 |倒序浏览
Mysql都是5.0以上的版本,linux 系统是UTF8,windows是日文系统,而两个系统中mysql里的字符集都是默认的latin1

出现的问题是 在windows下varchar(30)的字段可以存储30个汉字,而linux只能存10个汉字,看样子帽似与系统的字符集有关系,可能是什么原因?

问题2是为什么 latin1存储汉字也没有问题呢?


谢谢!

[ 本帖最后由 flw10000 于 2009-5-7 22:32 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-08 11:26 |只看该作者
这个问题有点复杂,希望我的接下来的表达让能明白。但我也不能一些不明白的地方一会,和你交流一下。

在windows下varchar(30)的字段可以存储30个汉字?
能不能贴一下。

show character set;
select version();
show create table YourTableName;

如果是UTF8的字符集,我觉的最多你可以存10个字符。
UTF8中的汉字需要占用三个字节。所以看到Linux下面只能存放10个汉字,那是正确的。


首先明确一下latin1是西欧字符集,也是可以存汉字的。gb2312本身兼容latin1
也就是gb2312>latin1
这样存汉字会有一个问题,有很多字,他会以为是一样的。

论坛徽章:
0
3 [报告]
发表于 2009-05-08 11:34 |只看该作者
我刚弄了一个Windows的MySQL试了一下:
mysql> create table wu ( name varchar(12));
Query OK, 0 rows affected (0.11 sec)
mysql> insert into wu values('一二三四五六七八九十');
Query OK, 1 row affected, 1 warning (0.03 sec)

mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'name' at row 1 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from wu;
+--------------+
| name         |
+--------------+
| 一二三四五六 |
+--------------+
1 row in set (0.00 sec)


mysql> show create table wu;
+-------+----------------------------------------------
------------------------------------------+
| Table | Create Table
                                          |
+-------+----------------------------------------------
------------------------------------------+
| wu    | CREATE TABLE `wu` (
  `name` varchar(12) character set latin1 default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

mysql> select version();
+----------------------+
| version()            |
+----------------------+
| 5.0.67-community-log |
+----------------------+
1 row in set (0.00 sec)

论坛徽章:
0
4 [报告]
发表于 2009-05-08 14:29 |只看该作者
原帖由 Coolriver 于 2009-5-8 11:26 发表
这个问题有点复杂,希望我的接下来的表达让能明白。但我也不能一些不明白的地方一会,和你交流一下。

在windows下varchar(30)的字段可以存储30个汉字?
能不能贴一下。

show character set;
select ver ...



谢谢Coolriver版主的关注!

windows下面存储30个汉字是没有问题的,在windows终端下看是30个'?',但是通过web界面是可以读出来的!

windows的具体版本是:5.0.51b-community-nt

mysql>show create table YourTableName;
最后有一行显示:
DEFAULT CHARSET=utf8

mysql>status;
其中几行的结果:

Server characterset: latin1
Db       characterset: uft8
Client  characterset: latin1
Conn.  characterset: latin1

论坛徽章:
0
5 [报告]
发表于 2009-05-08 14:44 |只看该作者
原帖由 Coolriver 于 2009-5-8 11:34 发表
mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'name' at row 1 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from wu;
+--------------+
| name         |
+--------------+
| 一二三四五六 |
+--------------+
1 row in set (0.00 sec)


mysql> show create table wu;
+-------+----------------------------------------------
------------------------------------------+
| Table | Create Table
                                          |
+-------+----------------------------------------------
------------------------------------------+
| wu    | CREATE TABLE `wu` (
  `name` varchar(12) character set latin1 default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

mysql> select version();
+----------------------+
| version()            |
+----------------------+
| 5.0.67-community-log |
+----------------------+
1 row in set (0.00 sec)
  


另外请教一下,你的这些信息是怎么贴出来的,mysql 有什么命令可以将执行的命令和结果都导出来吗?

论坛徽章:
0
6 [报告]
发表于 2009-05-09 10:03 |只看该作者
你要看该字段的字符集,而不是缺省字符集

所以你必须把表结构贴出来

可以断定,windows下的表的该字段字符集是非latin的,
而linux下表的该字段字符集是latin的.

latin1为什么能存汉字, 因为他不把汉字当字符看待, 只是认为是简单的ascii值(0--255之间), 即使不是汉字,乱码也可以存进去. (我曾经用latin1字符集存图片都可以),  linux下的环境是utf8, 一个汉字占3个字节, 所以varchar(30) character set latin1最多只能存10个汉字.

如果把字符集改为UTF8或日文集, 他就会把输入的字符当做真正意义的字符来看待,  而不是简单的ASCII值, 所以乱码是存不了的. varchar(30) character set utf8能存30个任意的字符(包括汉字)

[ 本帖最后由 trainee 于 2009-5-9 10:08 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP