MySQL的Varchar只能插入一个mysql 中文字符符,为什么

jsp不能够向mysql中插入中文字符_百度知道MySQL插入中文问题! - 跟谁学
搜索你想学的科目、老师试试,例如“英语”搜索吉安
&&MySQL插入中文问题!我在 MySQL 建了一个表 categories ,结构见下: +-------+--------------+------+-----+---------+----------------+
| Field | Type
| Null | Key | Default | Extra
+-------+--------------+------+-----+---------+----------------+
| PRI | NULL
| auto_increment |
| varchar(128) | YES
| UNI | NULL
+-------+--------------+------+-----+---------+---------------- 然而我插入中文的时候,会报错: mysql> insert into categories(name) values('测试');
ERROR ): Duplicate entry '??' for key 'name' 但是插入英文不会报错: mysql> insert into categories(name) values('test');
Query OK, 1 row affected (0.01 sec) 我的 MySQL 字符集设置如下: mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name
+--------------------------+----------------------------+
| character_set_client
| character_set_connection | utf8
| character_set_database
| character_set_filesystem | binary
| character_set_results
| character_set_server
| character_set_system
| character_sets_dir
| /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+ 这个问题如何解决啊?孤独的自我netBuffer
character_set_database 设置成utf8
跟字符集和中文半毛钱关系也没有好吗提示都说了:Duplicated entry说明你的 UNIQUE 字段重复了!学会解读错误啊少年
相关问题大家都在看最新提问
关注我们官方微信关于跟谁学服务支持帮助中心mysql&设置字符集(插入中文字符)
头一次用mysql数据库,结果出了这样的错误,建了一个表,其中有个字段“name”
类型为varchar(15),结果插入中文字,出现这样的错误:
Data too long for column
“name” at row 1
在网上找了很多解决办法,都没成功,
第一种失败的办法
设置数据编码为utf8
mysql&//test为数据库的名字
Database changed
mysql& set names utf8; //设置数据库字符集为utf8Query OK, 0
rows affected (0.00 sec)
第二种失败的办法,C:\Program Files\MySQL\MySQL Server 5.0下的my.ini
在[client]下添加
default-character-set=utf8
在[mysqld]下添加
default-character-set=utf8
第三种失败的办法
set character_set_database=utf8;
第四种失败的办法,我新建了一个数据库,编码都弄成utf8,然后他可以正常的插入中文,然后我把C:\Program
Files\MySQL\MySQL Server
5.0\data\下的对应这个可插入中文数据库的db.opt文件中的编码拷给我不能插入中文的数据库的db.opt文件,此时他们的编码应该是一样的,其它的理论上讲都是一样的,我在重启后,在插入还是不行,这真的是很让人理解不了
 而且编码全改成了utf8,还是不行,这真的让我很郁闷
&& mysql& show
variables like 'collation_%';
+----------------------+-----------------+
Variable_name&&&&&&&
Value&&&&&&&&&&
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database&& |
utf8_general_ci |
collation_server&&&&
| utf8_general_ci |
+----------------------+-----------------+
3 rows in set
mysql& show variables like 'character_set_%';
+--------------------------+---------------------------------------------------------+
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&&&&&&
| C:\Program Files\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set
成功的方法 
 最后精确到表了修改数据库中表的字符集编码,搞定,isa是我的数据库的名字,users是我的表名
Database changed
CHARACTER&&
SET&& utf8;
Database changed
Records: 3& Duplicates: 0&
Warnings: 0
同时也学到了一些相关的命令行操作
&相关命令操作
1。查看字符集编码的命令:
 mysql& show variables like '%char%';
然后会有:
+--------------------------+---------------------------------------------------------+
Variable_name&&&&&&&&&&&
Value&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
+--------------------------+---------------------------------------------------------+
character_set_client&&&&
utf8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
| character_set_connection |
utf8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
| character_set_database&& |
latin1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
| character_set_filesystem |
binary&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
character_set_results&&&
utf8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
character_set_server&&&&
latin1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
character_set_system&&&&
utf8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
character_sets_dir&&&&&&
| C:\Program Files\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set
如果你想改变某个值,如character_set_database的编码
mysql& set character_set_database=utf8;
alter database mydb charset=utf8;
show variables like 'collation_%';
show variables like 'character_set_%';
COLLATION(USER()), COLLATION('@');&
+-------------------+-----------------+
| COLLATION(USER()) | COLLATION('@')& |
+-------------------+-----------------+
| utf8_general_ci&& |
utf8_general_ci |
+-------------------+-----------------+
1 row in set
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。MYSQL数据库中定义成varchar类型,如何解决存入的中文字符不能正常显示问题?_百度知道MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚 · Ruby China
一、关于UTF-8
UTF-8 Unicode Transformation Format-8bit。是用以解决国际上字符的一种多字节编码。
它对英文使用8位(即一个字节) ,中文使用24位(三个字节)来编码。
UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。
UTF-8编码的文字可以在各国支持UTF8字符集额的浏览器上显示。
如果是UTF8编码,则在外国人的英文IE也能显示中文,他们无需下载IE的中文语言支持包。
二、关于GBK
GBK 是国家标准GB2312基础上扩容后兼容GB2312的标准。
GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。
GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。
三、关于utf8mb4
MySql 5.5 之前,UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区,BMP是从哪到哪?
基本就是 0000 ~ FFFF 这一区。
从MySQL 5.5 开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集。
utf8mb4 is a superset of utf8
tf8mb4兼容utf8,且比utf8能表示更多的字符。
至于什么时候用,看你做的什么项目了。。。
在做移动应用时,会遇到IOS用户在文本的区域输入emoji表情,如果不做一定处理,就会导致插入数据库异常。
四、汉字长度与编码有关
MySql 5.0 以上的版本:
1、一个汉字占多少长度与编码有关:
UTF-8:一个汉字 = 3个字节,英文是一个字节
一个汉字 = 2个字节,英文是一个字节
2、varchar(n) 表示n个字符,无论汉字和英文,MySql都能存入 n 个字符,仅实际字节长度有所区别。
3、MySQL检查长度,可用SQL语言
SELECT LENGTH(fieldname) FROM tablename
五、实际测试
1、首先使用utf8 创建
str_test 表。
CREATE TABLE `str_test` (
`name_chn` varchar(20) NOT NULL,
varchar(20) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8
然后插入值
mysql& insert into
str_test values ('我爱Ruby', 'I Love Ruby!');
Query OK, 1 row affected (0.02 sec)
&& "我爱Ruby".size
&& "I Love Ruby!".size
从MySQL中查询出来的结果,对比
mysql& select * from str_
+------------+--------------+
| name_chn
+------------+--------------+
| 我爱Ruby
| I Love Ruby! |
+------------+--------------+
1 row in set (0.02 sec)
mysql& select length(name_chn) from str_
+------------------+
| length(name_chn) |
+------------------+
+------------------+
1 row in set (0.01 sec)
3[一个汉字三字节] * 2 + 1[一个英文一字节] * 4 = 10
mysql& select length(name_en) from str_
+-----------------+
| length(name_en) |
+-----------------+
+-----------------+
1 row in set (0.00 sec)
10[一个英文一字节] * 1 + 2[空格一字节] * whitespace = 12
2、使用 GBK 做测试
CREATE TABLE `str_test` (
`name_chn` varchar(20) NOT NULL,
varchar(20) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk
插入数据,并且测试
mysql& insert into
str_test values ('我爱Ruby', 'I Love Ruby!');
Query OK, 1 row affected (0.00 sec)
mysql& select * from str_
+------------+--------------+
| name_chn
+------------+--------------+
| 我爱Ruby
| I Love Ruby! |
+------------+--------------+
1 row in set (0.01 sec)
GBK 中文是两个字节,英文是一个字节。
mysql& select length(name_chn) from str_
+------------------+
| length(name_chn) |
+------------------+
+------------------+
1 row in set (0.00 sec)
2[中文两个字节] * 2 + 4[英文一个字节] * 1 = 8
mysql& select length(name_en) from str_
+-----------------+
| length(name_en) |
+-----------------+
+-----------------+
1 row in set (0.00 sec)
10[英文一个字节] * 1 + 2[空格一个字节] * whitespace = 12
六、关于varchar 最多能存多少值
mysql的记录行长度是有限制的,不是无限长的,这个长度是64K,即65535个字节,对所有的表都是一样的。
MySQL对于变长类型的字段会有1-2个字节来保存字符长度。
当字符数小于等于255时,MySQL只用1个字节来记录,因为2的8次方减1只能存到255。
当字符数多余255时,就得用2个字节来存长度了。
在utf-8状态下的varchar,最大只能到 (65535 - 2) / 3 = 21844 余 1。
在gbk状态下的varchar, 最大只能到 (65535 - 2) / 2 = 32766 余 1
使用 utf-8 创建
CREATE TABLE `str_test` (
tinyint(1)
`name_chn` varchar(21845) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8
ERROR ): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
CREATE TABLE `str_test` (
tinyint(1)
`name_chn` varchar(21844) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8
Query OK, 0 rows affected (0.06 sec)
使用gbk创建
当存储长度为 32768 失败~
CREATE TABLE `str_test` (
tinyint(1)
`name_chn` varchar(32768) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk
ERROR ): Column length too big for column 'name_chn' (max = 32767); use BLOB or TEXT instead
当存储长度为 32767 失败~
CREATE TABLE `str_test` (
tinyint(1)
`name_chn` varchar(32767) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk
ERROR ): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
当存储长度为 32766 成功~
CREATE TABLE `str_test` (
tinyint(1)
`name_chn` varchar(32766) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk
Query OK, 0 rows affected (0.03 sec)
smallint 用两个字节存储,所以
2[smallint] + 32766 * 2[varchar存储长度] + 2[2个字节来存长度] & 65535
CREATE TABLE `str_test` (
smallint(1)
`name_chn` varchar(32766) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk
ERROR ): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
#####七、数值类型所占的字节
官方关于decimal 的描述如下
Values for DECIMAL (and NUMERIC) columns are represented using a binary format that packs nine decimal (base 10) digits into four bytes.
Storage for the integer and fractional parts of each value are determined separately.
Each multiple of nine digits requires four bytes, and the “leftover” digits require some fraction of four bytes.
The storage required for excess digits is given by the following table.
翻译为中文
使用二进制格式将9个十进制(基于10)数压缩为4个字节来表示DECIMAL列值。
每个值的整数和分数部分的存储分别确定。
每个9位数的倍数需要4个字节,并且“剩余的”位需要4个字节的一部分。
下表给出了超出位数的存储需求:
Leftover Digits
Number Of Bytes
那:decimal(10,2)占几个字节?
1、首先 10 指的是整数与小数部分的总长度, 2指的是小数部分的长度。那么整数部分就只有 10 - 2 = 8 位
2、因为整数与小数的存储市各自独立确定的,所以他们各自所占用空间的综合就是所占的总空间了。
3、对表可知,整数部分8位占了4个字节,小数部分2位占了1个字节,所以decimal(10,2)总共占了 4 + 1 = 5 个字节。
4、decimal(6,2) 整数部分(6 - 2 = 4) 位占2字节,小数部分2位占1字节,总共占3字节。
varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。
UTF-8:一个汉字 = 3个字节,英文是一个字节
一个汉字 = 2个字节,英文是一个字节
在utf-8状态下,汉字最多可以存 21844个字符串, 英文也为 21844个字符串。
在gbk状态下,汉字最多可以存 32766个字符串,英文也为 32766个字符串。
文章最后是不是笔误,应该是在gbk状态下,汉字最多可以存 32766 个字符,英文也为 32766 个字符吧。
sorry,我改下
正好用到,学习了 :)
中提及了此贴
后方可回复, 如果你还没有账号请点击这里 。
共收到 4 条回复}

我要回帖

更多关于 mysql 中文字符乱码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信