贫民窟里的程序高手

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

首先,字符集的问题:


mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | latin1                     | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql>

mysql的字符集分为几类
A.客户端字符集:通过系统变量”character_set_client“表示,通知server端,客户端提交的sql语句编码格式
B.连接字符集:通过系统变量”character_set_connectiont“表示,server端翻译sql语句时,使用的编码格式
C.结果集字符集:通过系统变量”character_set_results“表示,server端返回结果集之前把结果集转换成的编码格式
D.存储字符集:通过系统变量”character_set_results“和“character_set_server”表示,是数据在存储引擎里编码格式

 

为了不出现乱码,我们需要统一修改这些参数,比如我要把数据库的默认字符集改为utf8,如下所示

在[client]下添加如下参数
default-character-set=utf8

在[mysqld]下添加如下参数
default-character-set=utf8

然后重启mysql服务,再查看字符集(要重新登录客户端)


mysql> show variables like 'character%';
+--------------------------+----------------------------+
| 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       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+
8 rows in set (0.01 sec)


这条水平线 上面 的内容是指导我如何修改phpnow中mysql的编码格式的,事实证明没有什么卵用,能改掉其中character_set_server和character_set_database两项。

在mysql里运行set names ''
虽然机子是utf8,但是mysql必须是GBK

这个只是个命令,我用了,但是没有卵用。

MySQL数据库为GBK编号,.net程序使用默认编码(UTF-8),向mysql中插入数据容易产生乱码。解决办法是在连接字符串加入Charset=gbk:

MySqlConnection myConnection = new MySqlConnection("Database=test2;Data Source=localhost;User Id=root;Password=ikmbikmb;Charset=gbk");

这个最起码的还靠点儿谱。

最后记下解决方案,首先,改掉vs中数据库连接字符串的编码格式。

<add key="local" value="Server=localhost;Database=football;Uid=root;Pwd=root;Charset=gb2312;" />

然后,用navicat修改数据库的字符集格式。

再然后,修改数据库表的字符集格式。

这里要注意,数据库连接属性里的不要改。

至此,编码格式的问题算是解决了,可是我发现传过来的字符串不全,比如说四个字的值只传过来前两个字,后来发现是.net中MySqlParameter参数设置的问题。

于是,我增加了一个方法:

public void AddParameter(string key, object value, object dbtype, int size)
        {
            if (prms == null)
            {
                prms = new List<MySqlParameter>();
            }
            MySqlParameter mp = new MySqlParameter(key, value);
            mp.MySqlDbType = (MySqlDbType)dbtype;
            mp.Size = size;
            prms.Add(mp);
        }

使用的时候要注意,如果不设置的话,MySqlDbType默认是BLOB

vDBManager.AddParameter("@" + key, jd_home[key], MySqlDbType.VarChar, 50);

字符型的最好是这样传入,这样传入就没有问题了,当然经过测试,数字型的这样传入也没有问题。所以,可以将这个类型设为默认值,有特殊的再特殊处理。

 

posted on 2016-07-04 15:33  贫民窟里的程序高手  阅读(179)  评论(0编辑  收藏  举报