免费注册 查看新帖 |

Chinaunix

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

问关于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 01:47 |只看该作者

为什么我的可以?

mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


mysql> select * from t2\G
*************************** 1. row ***************************
  id: 1
name: ssssss
*************************** 2. row ***************************
  id: 2
name: 哈哈哈哈哈
2 rows in set (0.00 sec)


你贴下你的表的create 语句看看

论坛徽章:
0
5 [报告]
发表于 2009-12-13 09:21 |只看该作者
The Maximum Number of Columns Per Table
http://dev.mysql.com/doc/refman/5.1/en/column-count-limit.html


在insert和select中文信息时,如果select这次操作的client、server字符集和insert的字符集是一样的,就不会出现乱码的

[ 本帖最后由 justin033 于 2009-12-13 09:27 编辑 ]

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
6 [报告]
发表于 2009-12-13 11:00 |只看该作者
这是一个“字符”和“字节”之间的概念差异。
如果我没记错的话:
5.0之前,varchar(100)的100指的是字节数,因此只能存33个中文字。
5.0之后,varchar(100)的100指的是字符数,也就是能存100个中文字。

论坛徽章:
0
7 [报告]
发表于 2009-12-13 11:27 |只看该作者
试了把
5.0之前,varchar(100)的100指的是字节数,因此只能存33个中文字。
5.0之后,varchar(100)的100指的是字符数,也就是能存100个中文字。

我的mysql5.1 建了一个varchar(10)的字段,按照道理说可以存10个中文字符,但我存了6个,就会说数据太长,5个就可以


mysql> show create table t2\G
*************************** 1. row **********************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.02 sec)



mysql> insert into t2 (`name`) values ('哈哈哈哈哈哈');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> insert into t2 (`name`) values ('哈哈哈哈哈');
Query OK, 1 row affected (0.05 sec)

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
8 [报告]
发表于 2009-12-13 11:35 |只看该作者
你连接的字符集是什么?

论坛徽章:
0
9 [报告]
发表于 2009-12-13 11:47 |只看该作者

回复 #8 cenalulu 的帖子

汗 用了latin1
mysql> show variables like 'chara%'\G
*************************** 1. row ***************************
Variable_name: character_set_client
        Value: latin1
*************************** 2. row ***************************
Variable_name: character_set_connection
        Value: latin1
*************************** 3. row ***************************
Variable_name: character_set_database
        Value: utf8
*************************** 4. row ***************************
Variable_name: character_set_filesystem
        Value: binary
*************************** 5. row ***************************
Variable_name: character_set_results
        Value: latin1
*************************** 6. row ***************************
Variable_name: character_set_server
        Value: latin1
*************************** 7. row ***************************
Variable_name: character_set_system
        Value: utf8
*************************** 8. row ***************************
Variable_name: character_sets_dir
        Value: C:\Program Files\MySQL\MySQL Server 5.1\share\charsets\
8 rows in set (0.00 sec)


对了 我使用set names utf8 ,插入的时候乱码了,怎样解决好

难道去修改my.ini?

论坛徽章:
0
10 [报告]
发表于 2009-12-13 12:04 |只看该作者

修改了my.ini

[mysql]

default-character-set=gbk

修改成gbk

再重新插入


mysql> insert into t2 (name) values ('哈哈哈哈哈哈哈哈哈哈');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 (name) values ('哈哈哈哈哈哈哈哈哈哈哈');
ERROR 1406 (22001): Data too long for column 'name' at row 1


是可以插入10个汉字了~~11个的时候会报错
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP