免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ipaddr
打印 上一主题 下一主题

浅析字符集以及PHP+Mysql4.1的乱码问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-03-21 14:21 |只看该作者
我来看你了

论坛徽章:
0
12 [报告]
发表于 2006-03-31 22:05 |只看该作者
还是不行。
我全部的东西都用UTF8,包括命令行下的mysql客户端
但是,当我试图向一个UTF8形式的表插入一个中文字的时候
它还是提示:Data too long。

找遍了Google,Baidu,愣是没找到解决的方法,很多也根本无效

楼主能帮帮我么?

论坛徽章:
0
13 [报告]
发表于 2006-04-01 11:06 |只看该作者
原帖由 diogin 于 2006-3-31 22:05 发表
还是不行。
我全部的东西都用UTF8,包括命令行下的mysql客户端
但是,当我试图向一个UTF8形式的表插入一个中文字的时候
它还是提示:Data too long。

找遍了Google,Baidu,愣是没找到解决的方法,很多也根 ...

不会哦,我这里就是一直这么用的,就是因为要用简繁体中文,所以才配置成全部使用utf8的。
你把那个字段长度放长点,因为utf8编码的一个汉字是占用三个字节,会不会是这个问题?

论坛徽章:
0
14 [报告]
发表于 2006-04-01 14:14 |只看该作者
原帖由 rardge 于 2006-4-1 11:06 发表

不会哦,我这里就是一直这么用的,就是因为要用简繁体中文,所以才配置成全部使用utf8的。
你把那个字段长度放长点,因为utf8编码的一个汉字是占用三个字节,会不会是这个问题?


D:\Work>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.19-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
2 rows in set (0.08 sec)

mysql> show variables like "%coll%";
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.02 sec)

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       | C:\Professional\mysql\share\charsets\ |
+--------------------------+---------------------------------------+
8 rows in set (0.02 sec)

mysql> create database test;
Query OK, 1 row affected (0.34 sec)

mysql> use test;
Database changed
mysql> create table user (id int not null auto_increment primary key, cmd text);

Query OK, 0 rows affected (0.45 sec)

mysql> describe user;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI |         | auto_increment |
| cmd   | text    | YES  |     |         |                |
+-------+---------+------+-----+---------+----------------+
2 rows in set (0.08 sec)

mysql> insert into user values (NULL, 'aaaaaaaaaaaaaaaaaaa');
Query OK, 1 row affected (0.02 sec)

mysql> insert into user values (NULL, '这是中文');
ERROR 1406 (22001): Data too long for column 'cmd' at row 1
mysql> select * from user;
+----+---------------------+
| id | cmd                 |
+----+---------------------+
| 1  | aaaaaaaaaaaaaaaaaaa |
+----+---------------------+
1 row in set (0.00 sec)

mysql>

论坛徽章:
0
15 [报告]
发表于 2006-04-01 14:21 |只看该作者
mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.19, for Win32 (ia32)

Connection id:          1
Current database:       test
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.0.19-nt
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 15 sec

Threads: 1  Questions: 5  Slow queries: 0  Opens: 0  Flush tables: 1  Open table
s: 6  Queries per second avg: 0.333
--------------

mysql>


UTF8不是能容纳一切字符吗,为什么还是Data too long?
cmd列肯定是UTF8编码的,继承关系

论坛徽章:
0
16 [报告]
发表于 2006-04-01 14:50 |只看该作者
刚才搜到这么一段:

【2】php->mysql
1 可以修改my.ini的情况下,在[mysqld]添加或修改
init-connect='SET NAMES gb2312'


即使可以解决PHP连接时不用mysql_query("set names 'gb2312'", $link);
但还是没解决我的疑问:已经是text类型的字段,UTF8编码,为什么还是data too long?
UTF8是三字节,GBK和GB2312是两字节,理论上肯定能插得进去的
会不会是collation不匹配?

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+

utf8的collation我看了下还有其它好几个:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

D:\Work>net start mysql
The MySQL service is starting.
The MySQL service was started successfully.


D:\Work>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.19-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show collation;
+----------------------+----------+-----+---------+----------+---------+
| Collation            | Charset  | Id  | Default | Compiled | Sortlen |
+----------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci      | big5     | 1   | Yes     | Yes      | 1       |
| big5_bin             | big5     | 84  |         | Yes      | 1       |
| dec8_swedish_ci      | dec8     | 3   | Yes     |          | 0       |
| dec8_bin             | dec8     | 69  |         |          | 0       |
| cp850_general_ci     | cp850    | 4   | Yes     |          | 0       |
| cp850_bin            | cp850    | 80  |         |          | 0       |
| hp8_english_ci       | hp8      | 6   | Yes     |          | 0       |
| hp8_bin              | hp8      | 72  |         |          | 0       |
| koi8r_general_ci     | koi8r    | 7   | Yes     |          | 0       |
| koi8r_bin            | koi8r    | 74  |         |          | 0       |
| latin1_german1_ci    | latin1   | 5   |         |          | 0       |
| latin1_swedish_ci    | latin1   | 8   | Yes     | Yes      | 1       |
| latin1_danish_ci     | latin1   | 15  |         |          | 0       |
| latin1_german2_ci    | latin1   | 31  |         | Yes      | 2       |
| latin1_bin           | latin1   | 47  |         | Yes      | 1       |
| latin1_general_ci    | latin1   | 48  |         |          | 0       |
| latin1_general_cs    | latin1   | 49  |         |          | 0       |
| latin1_spanish_ci    | latin1   | 94  |         |          | 0       |
| latin2_czech_cs      | latin2   | 2   |         | Yes      | 4       |
| latin2_general_ci    | latin2   | 9   | Yes     |          | 0       |
| latin2_hungarian_ci  | latin2   | 21  |         |          | 0       |
| latin2_croatian_ci   | latin2   | 27  |         |          | 0       |
| latin2_bin           | latin2   | 77  |         |          | 0       |
| swe7_swedish_ci      | swe7     | 10  | Yes     |          | 0       |
| swe7_bin             | swe7     | 82  |         |          | 0       |
| ascii_general_ci     | ascii    | 11  | Yes     |          | 0       |
| ascii_bin            | ascii    | 65  |         |          | 0       |
| ujis_japanese_ci     | ujis     | 12  | Yes     | Yes      | 1       |
| ujis_bin             | ujis     | 91  |         | Yes      | 1       |
| sjis_japanese_ci     | sjis     | 13  | Yes     | Yes      | 1       |
| sjis_bin             | sjis     | 88  |         | Yes      | 1       |
| hebrew_general_ci    | hebrew   | 16  | Yes     |          | 0       |
| hebrew_bin           | hebrew   | 71  |         |          | 0       |
| tis620_thai_ci       | tis620   | 18  | Yes     | Yes      | 4       |
| tis620_bin           | tis620   | 89  |         | Yes      | 1       |
| euckr_korean_ci      | euckr    | 19  | Yes     | Yes      | 1       |
| euckr_bin            | euckr    | 85  |         | Yes      | 1       |
| koi8u_general_ci     | koi8u    | 22  | Yes     |          | 0       |
| koi8u_bin            | koi8u    | 75  |         |          | 0       |
| gb2312_chinese_ci    | gb2312   | 24  | Yes     | Yes      | 1       |
| gb2312_bin           | gb2312   | 86  |         | Yes      | 1       |
| greek_general_ci     | greek    | 25  | Yes     |          | 0       |
| greek_bin            | greek    | 70  |         |          | 0       |
| cp1250_general_ci    | cp1250   | 26  | Yes     |          | 0       |
| cp1250_czech_cs      | cp1250   | 34  |         | Yes      | 2       |
| cp1250_croatian_ci   | cp1250   | 44  |         |          | 0       |
| cp1250_bin           | cp1250   | 66  |         |          | 0       |
| gbk_chinese_ci       | gbk      | 28  | Yes     | Yes      | 1       |
| gbk_bin              | gbk      | 87  |         | Yes      | 1       |
| latin5_turkish_ci    | latin5   | 30  | Yes     |          | 0       |
| latin5_bin           | latin5   | 78  |         |          | 0       |
| armscii8_general_ci  | armscii8 | 32  | Yes     |          | 0       |
| armscii8_bin         | armscii8 | 64  |         |          | 0       |
| utf8_general_ci      | utf8     | 33  | Yes     | Yes      | 1       |
| utf8_bin             | utf8     | 83  |         | Yes      | 1       |
| utf8_unicode_ci      | utf8     | 192 |         | Yes      | 8       |
| utf8_icelandic_ci    | utf8     | 193 |         | Yes      | 8       |
| utf8_latvian_ci      | utf8     | 194 |         | Yes      | 8       |
| utf8_romanian_ci     | utf8     | 195 |         | Yes      | 8       |
| utf8_slovenian_ci    | utf8     | 196 |         | Yes      | 8       |
| utf8_polish_ci       | utf8     | 197 |         | Yes      | 8       |
| utf8_estonian_ci     | utf8     | 198 |         | Yes      | 8       |
| utf8_spanish_ci      | utf8     | 199 |         | Yes      | 8       |
| utf8_swedish_ci      | utf8     | 200 |         | Yes      | 8       |
| utf8_turkish_ci      | utf8     | 201 |         | Yes      | 8       |
| utf8_czech_ci        | utf8     | 202 |         | Yes      | 8       |
| utf8_danish_ci       | utf8     | 203 |         | Yes      | 8       |
| utf8_lithuanian_ci   | utf8     | 204 |         | Yes      | 8       |
| utf8_slovak_ci       | utf8     | 205 |         | Yes      | 8       |
| utf8_spanish2_ci     | utf8     | 206 |         | Yes      | 8       |
| utf8_roman_ci        | utf8     | 207 |         | Yes      | 8       |
| utf8_persian_ci      | utf8     | 208 |         | Yes      | 8       |
| utf8_esperanto_ci    | utf8     | 209 |         | Yes      | 8       |
| utf8_hungarian_ci    | utf8     | 210 |         | Yes      | 8       |
| ucs2_general_ci      | ucs2     | 35  | Yes     | Yes      | 1       |
| ucs2_bin             | ucs2     | 90  |         | Yes      | 1       |
| ucs2_unicode_ci      | ucs2     | 128 |         | Yes      | 8       |
| ucs2_icelandic_ci    | ucs2     | 129 |         | Yes      | 8       |
| ucs2_latvian_ci      | ucs2     | 130 |         | Yes      | 8       |
| ucs2_romanian_ci     | ucs2     | 131 |         | Yes      | 8       |
| ucs2_slovenian_ci    | ucs2     | 132 |         | Yes      | 8       |
| ucs2_polish_ci       | ucs2     | 133 |         | Yes      | 8       |
| ucs2_estonian_ci     | ucs2     | 134 |         | Yes      | 8       |
| ucs2_spanish_ci      | ucs2     | 135 |         | Yes      | 8       |
| ucs2_swedish_ci      | ucs2     | 136 |         | Yes      | 8       |
| ucs2_turkish_ci      | ucs2     | 137 |         | Yes      | 8       |
| ucs2_czech_ci        | ucs2     | 138 |         | Yes      | 8       |
| ucs2_danish_ci       | ucs2     | 139 |         | Yes      | 8       |
| ucs2_lithuanian_ci   | ucs2     | 140 |         | Yes      | 8       |
| ucs2_slovak_ci       | ucs2     | 141 |         | Yes      | 8       |
| ucs2_spanish2_ci     | ucs2     | 142 |         | Yes      | 8       |
| ucs2_roman_ci        | ucs2     | 143 |         | Yes      | 8       |
| ucs2_persian_ci      | ucs2     | 144 |         | Yes      | 8       |
| ucs2_esperanto_ci    | ucs2     | 145 |         | Yes      | 8       |
| ucs2_hungarian_ci    | ucs2     | 146 |         | Yes      | 8       |
| cp866_general_ci     | cp866    | 36  | Yes     |          | 0       |
| cp866_bin            | cp866    | 68  |         |          | 0       |
| keybcs2_general_ci   | keybcs2  | 37  | Yes     |          | 0       |
| keybcs2_bin          | keybcs2  | 73  |         |          | 0       |
| macce_general_ci     | macce    | 38  | Yes     |          | 0       |
| macce_bin            | macce    | 43  |         |          | 0       |
| macroman_general_ci  | macroman | 39  | Yes     |          | 0       |
| macroman_bin         | macroman | 53  |         |          | 0       |
| cp852_general_ci     | cp852    | 40  | Yes     |          | 0       |
| cp852_bin            | cp852    | 81  |         |          | 0       |
| latin7_estonian_cs   | latin7   | 20  |         |          | 0       |
| latin7_general_ci    | latin7   | 41  | Yes     |          | 0       |
| latin7_general_cs    | latin7   | 42  |         |          | 0       |
| latin7_bin           | latin7   | 79  |         |          | 0       |
| cp1251_bulgarian_ci  | cp1251   | 14  |         |          | 0       |
| cp1251_ukrainian_ci  | cp1251   | 23  |         |          | 0       |
| cp1251_bin           | cp1251   | 50  |         |          | 0       |
| cp1251_general_ci    | cp1251   | 51  | Yes     |          | 0       |
| cp1251_general_cs    | cp1251   | 52  |         |          | 0       |
| cp1256_general_ci    | cp1256   | 57  | Yes     |          | 0       |
| cp1256_bin           | cp1256   | 67  |         |          | 0       |
| cp1257_lithuanian_ci | cp1257   | 29  |         |          | 0       |
| cp1257_bin           | cp1257   | 58  |         |          | 0       |
| cp1257_general_ci    | cp1257   | 59  | Yes     |          | 0       |
| binary               | binary   | 63  | Yes     | Yes      | 1       |
| geostd8_general_ci   | geostd8  | 92  | Yes     |          | 0       |
| geostd8_bin          | geostd8  | 93  |         |          | 0       |
| cp932_japanese_ci    | cp932    | 95  | Yes     | Yes      | 1       |
| cp932_bin            | cp932    | 96  |         | Yes      | 1       |
| eucjpms_japanese_ci  | eucjpms  | 97  | Yes     | Yes      | 1       |
| eucjpms_bin          | eucjpms  | 98  |         | Yes      | 1       |
+----------------------+----------+-----+---------+----------+---------+
126 rows in set (0.00 sec)

mysql>

论坛徽章:
0
17 [报告]
发表于 2006-04-01 15:53 |只看该作者
贴一段我的测试代码,表 user 就是用你提供的语句建立的。我这里数据库也是 utf8 编码。

  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");

  3. $link_id = @mysql_connect('127.0.0.1', 'anyone', '') or die(mysql_error());
  4. @mysql_select_db('test', $link_id);

  5. mysql_query('set names utf8') or die(mysql_error());

  6. $SQL = "insert into user values (NULL, 'aaaaaaaaaaaaaaaaaaa'), (NULL, '這是中文')";
  7. mysql_query($SQL, $link_id) or die(mysql_error());

  8. $SQL = "select * from user";
  9. $result = mysql_query($SQL, $link_id) or die(mysql_error());
  10. for($i = 0; $i < mysql_num_rows($result); $i++) {
  11.         $a = mysql_fetch_array($result);
  12.         echo $a['cmd'] . "<br>\n";
  13. }

  14. mysql_close($link_id);
  15. echo "OK 啦";
  16. ?>
复制代码


web 上执行结果:

  1. aaaaaaaaaaaaaaaaaaa
  2. 這是中文
  3. OK 啦
复制代码


因为我无法在终端中使用 utf 编码,所以只能通过 web 程序来演示。

论坛徽章:
0
18 [报告]
发表于 2006-04-01 16:26 |只看该作者
感谢楼上,我总算知道为什么了
刚才也用PHP来连,文件名是index.php
内容是:

<?php
$conn = mysql_connect('localhost', 'root', '123456');
!$conn && die('1');
!mysql_query("set names 'utf8'", $conn) && die('2');
!mysql_select_db('test', $conn) && die('3');
!mysql_query("insert into user values (NULL, '这是中文')") && die('4');
$res = mysql_query('select * from user', $conn);
!$res && die('5');
while ($row = mysql_fetch_array($res)) {
    echo $row['id'] . ' ' . $row['cmd'] . '<br>';
}
mysql_close($conn);
?>


一开始访问,出错在第4步,也就是无法插入
接着修改一下index.php的格式为:UNIX格式,UTF8编码
再访问一下,就正常了
因为我在Windows下,所以默认不是这种格式,而是DOS/ASCII格式
所以导致一直不能插入一直乱码。
看来Windows下与UNIX下要注意的移植问题可真多。

其实是我没认真阅读楼主的文章,对不起楼主了:)

论坛徽章:
0
19 [报告]
发表于 2006-04-01 18:35 |只看该作者

I catch something

I have read it.I catch something.I want getting another or more .This is my e-mail:micht767@sohu.com,please!I will approciate you.Thanks a lot.

论坛徽章:
0
20 [报告]
发表于 2006-04-02 11:11 |只看该作者

我还是没明白,希望楼住再总结以下!

我还是没明白,希望楼住再总结以下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP