免费注册 查看新帖 |

Chinaunix

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

问关于varchar存储汉字问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-12 15:11 |显示全部楼层 |倒序浏览
发现基础知识太弱了

我通过length函数查找字段最大字节数时发现 某个存汉字的列定义数据类型为varchar(100),我找到的最大长度为300,汉字是通过utf8格式存储因此每个字是3个字节,也就是定义了存放了100个字节的盒子存放了300个字节的东西,为什么会这样?请教各位

论坛徽章:
0
2 [报告]
发表于 2009-12-12 15:50 |显示全部楼层
而我自己建了一个字段来测试,确实varchar(10)只能存储3个汉字还多个乱码,为什么呢?

论坛徽章:
0
3 [报告]
发表于 2009-12-12 16:17 |显示全部楼层
放上实例

mysql> select product from trade where length(product)=(select max(length(product)) from trade) limit 1\G;
*************************** 1. row ***************************
product: 、图书报警系统、图书防盗仪、药品防盗、药品防盗设备书、药品检查仪、药品报警系统、药品防盗仪、超市防盗仪、超市防盗、超市防盗设备、超市防盗仪、超市报警系统、服装报警系统、服装防盗仪、服装防盗设备、服装防
1 row in set (9.26 sec)

mysql> show columns from trade where type='varchar(100)';
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| product      | varchar(100) | YES  | MUL | NULL    |       |

我自己测试的

mysql> select * from t1;
+------+------------+---------------------+
| id   | name       | date                |
+------+------------+---------------------+
|    1 | name 'with | 2009-11-26 08:47:53 |
|    2 | i am maste | 2009-12-07 11:36:05 |
|    3 | aaa        | 2009-12-12 10:38:26 |
|    4 | aaaaaaaaaa | 2009-12-12 14:43:04 |
|    5 | 数据库▒ | 2009-12-12 15:20:07 |
|    6 | 测试     | 2009-12-12 15:26:43 |
|    7 | ??11       | 2009-12-12 15:27:32 |
|    8 | ??222      | 2009-12-12 15:31:15 |
|    9 | ??44       | 2009-12-12 15:32:36 |
|    9 | ??55       | 2009-12-12 15:33:15 |
|   10 | 测试拉▒ | 2009-12-12 15:47:44 |
+------+------------+---------------------+

mysql> show columns from t1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(5)      | YES  |     | NULL    |       |
| name  | varchar(10) | YES  | MUL | NULL    |       |
| date  | datetime    | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

论坛徽章:
0
4 [报告]
发表于 2009-12-13 14:26 |显示全部楼层
我用的是5.0版本的MYSQL,具体情况明天上班再看看

论坛徽章:
0
5 [报告]
发表于 2009-12-14 16:51 |显示全部楼层

回复 #4 yangward 的帖子

Table: trade
Create Table: CREATE TABLE `trade` (
  `id` int(11) NOT NULL auto_increment,
  `poster` varchar(50) collate utf8_unicode_ci default NULL,
  `editor` varchar(20) collate utf8_unicode_ci default NULL,
  `post_date` timestamp NULL default CURRENT_TIMESTAMP,
  `pubDate` date default NULL,
  `webSite` varchar(60) collate utf8_unicode_ci default NULL,
  `type` varchar(10) collate utf8_unicode_ci NOT NULL default '',
  `title` varchar(150) collate utf8_unicode_ci default NULL,
  `product` varchar(100) collate utf8_unicode_ci default NULL,
  `link` varchar(255) collate utf8_unicode_ci default NULL,
  `category` varchar(20) collate utf8_unicode_ci default NULL,
  `subcategory` varchar(20) collate utf8_unicode_ci default NULL,
  `region` varchar(20) collate utf8_unicode_ci default NULL,
  `expiryDate` int(11) default '30',
  `company` varchar(100) collate utf8_unicode_ci default NULL,
  `intro` text collate utf8_unicode_ci,
  `contact` varchar(50) collate utf8_unicode_ci default NULL,
  `tel` varchar(50) collate utf8_unicode_ci default NULL,
  `fax` varchar(50) collate utf8_unicode_ci default NULL,
  `zip` varchar(20) collate utf8_unicode_ci default NULL,
  `mobile` varchar(30) collate utf8_unicode_ci default NULL,
  `email` varchar(50) collate utf8_unicode_ci default NULL,
  `address` varchar(100) collate utf8_unicode_ci default NULL,
  `company_http` varchar(100) collate utf8_unicode_ci default NULL,
  `keywords` varchar(100) collate utf8_unicode_ci default NULL,
  `pic_name` varchar(20) collate utf8_unicode_ci default NULL,
  `pic_name1` varchar(100) collate utf8_unicode_ci default NULL,
  `image` varchar(200) collate utf8_unicode_ci default NULL,
  `data_flag` tinyint(4) default '0',
  `ip_address` varchar(20) collate utf8_unicode_ci default NULL,
  `additional` text collate utf8_unicode_ci,
  `in_Q` tinyint(2) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `category` (`category`),
  KEY `subcategory` (`subcategory`),
  KEY `pubDate` (`pubDate`),
  KEY `poster` (`poster`),
  KEY `product` (`product`),
  KEY `data_flag` (`data_flag`),
  KEY `post_date` (`post_date`),
  KEY `type` (`type`,`category`)
) ENGINE=MyISAM AUTO_INCREMENT=135201077 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci MAX_ROWS=1000000000 AVG_ROW_LENGTH=15000

论坛徽章:
0
6 [报告]
发表于 2009-12-14 16:53 |显示全部楼层

回复 #6 cenalulu 的帖子

mysql> select version();
+------------+
| version()  |
+------------+
| 5.0.45-log |
+------------+

论坛徽章:
0
7 [报告]
发表于 2009-12-14 16:55 |显示全部楼层
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

论坛徽章:
0
8 [报告]
发表于 2009-12-14 16:56 |显示全部楼层
我自己的测试表
mysql> show create table test.t1\G;
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(5) default NULL,
  `name` varchar(10) character set utf8 collate utf8_unicode_ci default NULL,
  `date` datetime default NULL,
  FULLTEXT KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

论坛徽章:
0
9 [报告]
发表于 2009-12-14 17:06 |显示全部楼层
我知道了,是设置问题,我把 character_set_client,character_set_connection, character_set_database都设置成UTF8 ,varchar(10)就可以插入10个字符了,下班

论坛徽章:
0
10 [报告]
发表于 2009-12-15 10:11 |显示全部楼层
哦,又学到了,原来set names utf8是临时改变character_set_client,character_set_connection, character_set_results 为utf8

刚看到 charset utf8也是一样的

[ 本帖最后由 justlooks 于 2009-12-15 11:07 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP