zoukankan      html  css  js  c++  java
  • UTF8默认编码下的MYSQL命令框中输入汉字显示乱码的问题 分类: 测试 2013-08-02 14:16 371人阅读 评论(0) 收藏

    UTF8默认编码下的MYSQL命令框中输入汉字显示乱码的问题:比如select count(`姓名`) from tb

    就出错,如果只是想临时修改编码以利于查询GB2312GBK,可用以下2命令(关闭客户端后又恢复UTF8):

    1mysql> set character_set_client='gbk';或:set character_set_client=gb2312;定义客户端编码

    2mysql> set character_set_results='gbk';或:set character_set_results=gb2312;定义结果集编码。

    如果想存储也用GBk,则加设character_set_database


    collation是排序相关的字符集变量,用show variables like 'collation%';显示,collation_connection:意义可类推


    以上set character_set_.....是一条条修改,也可用set names 'gbk'一下子全部修改字符集
    set names 'gbk'等价于(不会对character_set_database影响):
    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x

    -----------------------------------------------------------------------------------------------------

    MySQL数据库在字符集的处理上,可以说是相当灵活。以下是我在实际工作中关于字符集的设置与处理方面的一个总结。

      一、显示字符集相关的变量值

      mysql> show variables like 'chara%';

      +--------------------------+-------------------------------------------+

      | Variable_name | Value |

      +--------------------------+-------------------------------------------+

      | character_set_client | latin1 |

      | character_set_connection | latin1 |

      | character_set_database | latin1 |

      | character_set_results | latin1 |

      | character_set_server | latin1 |

      | character_set_system | utf8 |

      | character_sets_dir | d:mysql-5.0.9-beta-win32sharecharsets/ |

      +--------------------------+-------------------------------------------+

      7 rows in set (0.02 sec)

      mysql> show variables like 'collation%';

    +----------------------+-----------------+
    | Variable_name        | Value           |
    +----------------------+-----------------+
    | collation_connection | utf8_general_ci |
    | collation_database   | gbk_chinese_ci  |
    | collation_server     | utf8_general_ci |
    +----------------------+-----------------+
    3 rows in set

      需要说明的是: collation是与排序相关的字符集变量, 上述变量值是mysql

    二、字符集相关各变量的意义

      character_set_client: 客户端字符集(应用程序客户端使用的字符集),实际上它与当前会话相关

      character_set_connection: 连接字符集,指的是mysql网络传输中使用的字符集,也与会话相关

      character_set_database: 指的数据库表中物理存储使用的字符集。

      character_set_results: 指的是使用sql查询处理以后返回结果使用的字符集。

      character_set_server:指的是mysql数据库服务器端使用的字符集。

      character_set_system:指的是数据库中存储元信息使用的字符集。

      collation_connection:意义可以类推

    三、字符集的修改

      我们可以对单个变量进行修改,如

      set character_set_client=gbk

      也可以使用set names 来同时修改几个变量, 如

      set names 'gbk' 可一下子全部修改字符集

      等价于:

      SET character_set_client = x;

      SET character_set_results = x;

      SET character_set_connection = x;

      值得注意的是:collation_connection变量缺省下与character_set_connection是相关联的,

      collation_connection取决于character_set_connection的值。

      如:

      mysql> set names 'gbk';

      Query OK, 0 rows affected (0.08 sec)

      mysql> show variables like 'chara%';

      +--------------------------+-------------------------------------------+

      | Variable_name | Value |

      +--------------------------+-------------------------------------------+

      | character_set_client | gbk |

      | character_set_connection | gbk |

      | character_set_database | latin1 |

      | character_set_results | gbk |

      | character_set_server | latin1 |

      | character_set_system | utf8 |

      | character_sets_dir | d:mysql-5.0.9-beta-win32sharecharsets/ |

      +--------------------------+-------------------------------------------+

      7 rows in set (0.00 sec)

      mysql> show variables like 'collation%';

      +----------------------+-------------------+

      | Variable_name | Value |

      +----------------------+-------------------+

      | collation_connection | gbk_chinese_ci |

      | collation_database | latin1_swedish_ci |

      | collation_server | latin1_swedish_ci |

      +----------------------+-------------------+

      3 rows in set (0.00 sec)

      我们可以看到 set names 'gbk'改变了character_set_client, character_set_connection, character_set_results, collation_connection的值.

      如果要单独指定collation_name,可以使用

      SET NAMES 'charset_name' COLLATE 'collation_name'

      另一种修改多个变量的命令是:

      SET CHARACTER SET x 等价于:

      SET character_set_client = x;

      SET character_set_results = x;

      SET collation_connection = @@collation_database;

      你可以自己体验一下该命令带来的字符集变量值的变动。

      那么character_set_server, character_set_database的值怎么修改呢?直接在命令行里修改是不起作用的。

      最好的方式是在配置文件my.ini中直接修改,在[mysqld]项下边添加:

      default_character_set=GBK

      当然,你如果想尝试,使用mysqld-nt --default_character_set=GBK来启动数据库也未尝不可,但我并不推荐这么做。

      my.ini文件的搜索顺序是:

      在版本4.1.5之前,必须在c:my.cnf or c:Windowsmy.ini下边,这个有待检验。

      在后续版本里,my.ini缺省就在mysql的安装目录下边。

      强调一点:mysql --default-character-set=gbk -u root

      或 mysql --defaults-file=c:my.ini -u root

      在my.ini中添加如下内容

      [mysql] or [client]

      default-character-set=gbk

      或mysql -u root再执行set names 'gbk'

      这三者效果完全一样。

     四、乱码的产生

      乱码的产生主要是由于字符集变量设置的不一致造成的。

      操作系统有一个在显示字符时要使用的locale变量,linux下使用locale命令可以看到。

      windows下使用chcp可以看到,gbk对应的code page应该是936。

      如果操作系统安装了当前字符集与目标字符集的转换表,则能正确显示目标字符集中的字符,否则就会出现乱码。

      latin1对应的是iso8859_1字符集,默认情况下,可以与gbk相互转换,至少在操作系统一级是这样。

      五.乱码的避免

      最好让上述9个字符集变量值保持一致,或者至少"兼容",同时也要考虑到OS中locale的值。

      当然:character_set_system例外,它是存储和表示元信息使用的字符集,一般都是ascii串,使用utf8和使用latin1基本一样,但是,如果使用中文,可能就另当别论了。下边说的全部变量是指除了character_set_system以外的其它变量。

      这里推荐三个方案:

      1. 全部使用latin1

      但是在java程序中,它担着一定的风险,即在入库之前,需要将字符串从gbk转换到iso8859_1,出库以后,获取结果时,再从iso8859_1转到gbk.

      否则会出现乱码。

      这种方式比较适合于C代码,显示依赖于操作系统的locale.一般都不用转换。

      2. 全中文支持,全部设置成gbk.

      方法:

      在my.ini中修改添加:(这个是必须的)

      [mysqld]

      default-character-set=gbk

      在java程序里边使用"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GBK"这样的url,表明使用GBK进行编码。

      3. utf8字符集支持.

      方法:

      在my.ini中修改添加:

      [mysqld]

      default-character-set=utf8

      在java程序里边使用"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"这样的url,表明使用GBK进行编码。

      注意utf8与UTF-8的分别.

      utf8的好处是java虚拟机可以自动将它与gbk进行转换,因而显示都不会有乱码。可是在控制台下(cmd),显示就有问题了

  • 相关阅读:
    Linux中history执行历史命令方法
    Linux中返回上一次目录
    Linux的vi编辑模式下常用快捷键
    [Android] TextView上同时显示图标和文字
    [Android] macOS的Android Studio快捷键
    [Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩
    [iOS] 测试设备解决自签名证书问题
    [macOS] keychain的跳坑之旅!git拉取的权限问题
    [PHP] swoole在daemonize模式下,chdir失效问题
    [macOS] macOS下,VirtualBox安装CentOS7.4, 搭建nginx, mysql, PHP5.6&PHP7.1
  • 原文地址:https://www.cnblogs.com/think1988/p/4628115.html
Copyright © 2011-2022 走看看