• mysql字符集&插入中文数据乱码问题


    乱码即字符集有问题,本篇将介绍mysql字符集及插入中文数据乱码问题的解决方式

    1.mysql字符集

    GBK      不是国际标准

    UTF-8   中英文混合的环境,建议使用此字符集,用的比较多

    Latin1    mysql的默认字符集

    urf8mb4 UTF-8 Unicode

    2.解决插入中文数据乱码问题

    2.1)通过在库里set names解决乱码问题

    2.2)为防止乱码,最好在文本文件里写好,然后执行:

    在执行DQL、DML语句之前set names 系统及库表的字符集!

    在SQL文件中指定set names latin1,然后登陆mysql执行如下:

    mysql>source /root/test.sql

    2.3)在SQL文件中指定set names latin1,然后通过mysql命令导入数据

    mysql -uroot -p456 oldboy < test.sql

    mysql -uroot -p456 -e "set names latin1;select * from oldboy.test;"

    2.4)通过mysql命令加字符集参数导入数据解决乱码

    mysql -uroot -p456 --default-character-set=latin1 oldboy < test.sql

    可在mysql库外面查询情况:

    mysql -uroot -p456 -e "set names latin1;select * from oldboy.test;"

    2.5)在配置文件里设置客户端及服务端相关参数

    更改my.cnf客户端模块的参数,可以实现set names utf8的效果,并且永久生效。

    【client】客户端

    default-character-set=utf8  #无需重启服务,退出重新登录就生效

    【mysqld】服务端

    default-character-set=utf8  #适合5.1及以前版本

    character-set-server=utf8  #适合5.5 需重启才生效

    【Linux系统服务端】

    cat /etc/sysconfig/i18n

    LANG="zh_CN.utf8"

    . /etc/sysconfig/i18n 即source

    提示:Linux客户端也要更改字符集(在窗口界面里更改)

    2.6)也可在建立库表时限制字符集:

    需找到默认的collation

    create database oldboy_utf8 default character set UTF8 collate utf8_general_ci;

    3.查看与字符集相关的参数

    以下客户端字符集、连接字符集、数据库字符集、返回结果字符集、服务器字符集需保持统一:

    mysql中执行的set names utf8其实相当于更改的client、connection和results的字符集。(临时更改)

    mysql客户端增加参数default-character-set=utf8 相当于更改的client、connection和results的字符集。(临时更改)

    character-set-server=uft8服务端相当于改的database、system的字符集。

    【补充】关于mysql参数

    show variables like '%key_buffer%';                 #显示某个模糊的参数

    show global status;                                          #可以看到所有的variable_name

    set global key_buffer_size=XXX ;                    #库中设置某参数的值

    在my.cnf中加key_buffer_size= XXX;

    4.对已上线的数据库数据字符集修改

    对于已有的数据库修改字符集不能直接通过 "alter database character set *"或“alter table tablename character set *”,这两个都只对新创建的表或者记录生效。

    以将已有的通过Latin1创建的表数据更改为utf8为例:

    4.1)建库及建表的语句导出,sed批量修改为utf8

    mysqldump -uroot -p --default-character-set=latin1 -d dbname>alltable.sql,编辑alltable.sql将Latin1改为utf8                        # -d 表示只导表结构

    4.2)确保数据库不再更新,导出所有数据

    mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 dbname>alldata.sql

    --quick:用于转储大的表,强制mysqldump从服务器一次次的检索数据而不是检索所有行,并输出前CACHE到内存中,

    --no-create-info:不创建create table 语句,

    --extended-insert:使用包括几个values列表的多行insert语法,这样文件更小,IO也小,导入数据时会非常快,

    --default-character-set=latin1 按照原有字符集导出数据,这样导出的文件中,所有文件都是可见的,不会保存成乱码。

    4.3)修改mysql服务端和客户端编码为utf8

    或者打开alldata.sql将set names Latin1改为set names utf8

    4.4)删除原有的库表及数据

    4.5)导入新的建库及建表语句

    create database dbname default charset utf8;

    mysql -uroot -p dbname<alltable.sql

    4.6)导入mysql的所有数据

     mysql -uroot -p dbname<alldata.sql

    2018年10月30日

    祝好!

  • 相关阅读:
    RestTemplate方法总结
    服务器上获取不到header中设置的自定义的属性值
    记录一次 事务问题 的处理
    java 集合按照 数值排序,如果数值一致 按照名字首字母排序
    mysql中按照中文首字母A-Z排序
    java 关于小数 换算整数 的一点想法
    mysql 根据身份证查询 年龄 性别
    MySQL普通索引(BTREE索引)以及最左前缀匹配
    net.sf.json的常用api
    Object划分
  • 原文地址:https://www.cnblogs.com/wangke2017/p/9655153.html
Copyright © 2020-2023  润新知