西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网
当前位置: 主页 > 开发教程 > linux教程 >

Windows使用MySQL数据库管理系统中文乱码问题(2)

时间:2016-05-11 23:04来源:未知 作者:好模板 点击:
2. 修改MySQL原始配置文件 # MySQL Server Instance Configuration File # 翻译:MySQL服务器实例配置文件# ----------------------------------------------------------------------# Generat

  2. 修改MySQL原始配置文件

复制代码
# MySQL Server Instance Configuration File   
# 翻译:MySQL服务器实例配置文件
# ----------------------------------------------------------------------
# Generated by the MySQL Server Instance Configuration Wizard
# 翻译:由MySQL服务器实例配置向导自动生成
#
# Installation Instructions
# 翻译:安装指南
# ----------------------------------------------------------------------
#
# On Linux you can copy this file to /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options
# (@localstatedir@ for this installation) or to
# ~/.my.cnf to set user-specific options.
#
# On Windows you should keep this file in the installation directory 
# of your server (e.g. C:\Program Files\MySQL\MySQL Server X.Y). To
# make sure the server reads the config file use the startup option 
# "--defaults-file". 
# 翻译:在Windows中必须将该文件(my.ini)保存在MySQL服务器的安装目录中。
#       确保服务器在使用启动项"--defaults-file"时入读该配置文件。
#
# To run the server from the command line, execute this in a 
# command line shell, e.g.
# 翻译:为了能命令行运行服务器,需在命令行shell中执行如下命令。
# mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server X.Y\my.ini"  
# 注意:不同的安装路径,参数字符串内容一般不同。主要是找到my.ini绝对路径即可。
#
# To install the server as a Windows service manually, execute this in a 
# command line shell, e.g.
# 翻译:为了能够将MySQL服务器手动安装成Windows服务,需在命令行shell中执行以下命令。
# mysqld --install MySQLXY --defaults-file="C:\Program Files\MySQL\MySQL Server X.Y\my.ini"
#
# And then execute this in a command line shell to start the server, e.g.
# 翻译:然后在命令行shell中执行如下命令启动MySQL服务器。
# net start MySQLXY
#
#
# Guildlines for editing this file 
# 翻译:编辑本配置文件的指导路线
# ----------------------------------------------------------------------
#
# In this file, you can use all long options that the program supports.
# If you want to know the options a program supports, start the program
# with the "--help" option.
#
# More detailed information about the individual options can also be
# found in the manual.
#
#
# CLIENT SECTION
# 翻译:客户端部分
# ----------------------------------------------------------------------
#
# The following options will be read by MySQL client applications.
# Note that only client applications shipped by MySQL are guaranteed
# to read this section. If you want your own MySQL client program to
# honor these values, you need to specify it as an option during the
# MySQL client library initialization.
#
#
[client]

port=3306

[mysql]

default-character-set=latin1
# 注意:此处需修改为gbk或utf-8

# SERVER SECTION
# 翻译:服务器端部分
# ----------------------------------------------------------------------
#
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this 
# file.
# 翻译:下列选项将会被MySQL服务器读取。
#       为了MySQL服务器能够读取本文件,确保已经正确安装MySQL服务器。
[mysqld]

# The TCP/IP Port the MySQL Server will listen on
# 翻译:MySQL服务器将会监听的TCP/IP端口
port=3306

#Path to installation directory. All paths are usually resolved relative to this.
# 翻译:安装目录路径。所有的路径解析通常相对的就是安装目录路径。
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
# 注意:basedir基础路径,即所有相对路径的基础路径。不同安装情况,具体有略微区别。

#Path to the database root
# 翻译:数据库root用户路径
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"

# The default character set that will be used when a new schema or table is
# created and no character set is defined
# 翻译:当一个新的schema或者tableb被创建,并且没有字符集被定义时将使用如下默认字符集定义。
character-set-server=latin1
# 注意:此处需要改动为gbk或utf-8。

# The default storage engine that will be used when create new tables when
# 翻译:在创建新的表时,如下默认储存引擎将会被使用
default-storage-engine=INNODB
# 注意:INNODB是MySQL的数据库引擎之一,为MySQL AB公司发布binary标准之一,原本由Innobase Oy公司所开发,后被Oracle并购。

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

# The maximum amount of concurrent sessions the MySQL server will
# allow. One of these connections will be reserved for a user with
# SUPER privileges to allow the administrator to login even if the
# connection limit has been reached.
max_connections=100

# Query cache is used to cache SELECT results and later return them
# without actual executing the same query once again. Having the query
# cache enabled may result in significant speed improvements, if your
# have a lot of identical queries and rarely changing tables. See the
# "Qcache_lowmem_prunes" status variable to check if the current value
# is high enough for your load.
# Note: In case your tables change very often or if your queries are
# textually different every time, the query cache may result in a
# slowdown instead of a performance improvement.
query_cache_size=0

# The number of open tables for all threads. Increasing this value
# increases the number of file descriptors that mysqld requires.
# Therefore you have to make sure to set the amount of open files
# allowed to at least 4096 in the variable "open-files-limit" in
# section [mysqld_safe]
table_cache=256

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
tmp_table_size=18M


# How many threads we should keep in a cache for reuse. When a client
# disconnects, the client's threads are put in the cache if there aren't
# more than thread_cache_size threads from before.  This greatly reduces
# the amount of thread creations needed if you have a lot of new
# connections. (Normally this doesn't give a notable performance
# improvement if you have a good thread implementation.)
thread_cache_size=8

#*** MyISAM Specific options

# The maximum size of the temporary file MySQL is allowed to use while
# recreating the index (during REPAIR, ALTER TABLE or LOAD DATA INFILE.
# If the file-size would be bigger than this, the index will be created
# through the key cache (which is slower).
myisam_max_sort_file_size=100G

# If the temporary file used for fast index creation would be bigger
# than using the key cache by the amount specified here, then prefer the
# key cache method.  This is mainly used to force long character keys in
# large tables to use the slower key cache method to create the index.
myisam_sort_buffer_size=35M

# Size of the Key Buffer, used to cache index blocks for MyISAM tables.
# Do not set it larger than 30% of your available memory, as some memory
# is also required by the OS to cache rows. Even if you're not using
# MyISAM tables, you should still set it to 8-64M as it will also be
# used for internal temporary disk tables.
key_buffer_size=25M

# Size of the buffer used for doing full table scans of MyISAM tables.
# Allocated per thread, if a full scan is needed.
read_buffer_size=64K
read_rnd_buffer_size=256K

# This buffer is allocated when MySQL needs to rebuild the index in
# REPAIR, OPTIMZE, ALTER table statements as well as in LOAD DATA INFILE
# into an empty table. It is allocated per thread so be careful with
# large settings.
sort_buffer_size=256K


#*** INNODB Specific options ***


# Use this option if you have a MySQL server with InnoDB support enabled
# but you do not plan to use it. This will save memory and disk space
# and speed up some things.
# skip-innodb

# Additional memory pool that is used by InnoDB to store metadata
# information.  If InnoDB requires more memory for this purpose it will
# start to allocate it from the OS.  As this is fast enough on most
# recent operating systems, you normally do not need to change this
# value. SHOW INNODB STATUS will display the current amount used.
innodb_additional_mem_pool_size=2M

# If set to 1, InnoDB will flush (fsync) the transaction logs to the
# disk at each commit, which offers full ACID behavior. If you are
# willing to compromise this safety, and you are running small
# transactions, you may set this to 0 or 2 to reduce disk I/O to the
# logs. Value 0 means that the log is only written to the log file and
# the log file flushed to disk approximately once per second. Value 2
# means the log is written to the log file at each commit, but the log
# file is only flushed to disk approximately once per second.
innodb_flush_log_at_trx_commit=1

# The size of the buffer InnoDB uses for buffering log data. As soon as
# it is full, InnoDB will have to flush it to disk. As it is flushed
# once per second anyway, it does not make sense to have it very large
# (even with long transactions).
innodb_log_buffer_size=1M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system.  Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
innodb_buffer_pool_size=47M

# Size of each log file in a log group. You should set the combined size
# of log files to about 25%-100% of your buffer pool size to avoid
# unneeded buffer pool flush activity on log file overwrite. However,
# note that a larger logfile size will increase the time needed for the
# recovery process.
innodb_log_file_size=24M

# Number of threads allowed inside the InnoDB kernel. The optimal value
# depends highly on the application, hardware as well as the OS
# scheduler properties. A too high value may lead to thread thrashing.
innodb_thread_concurrency=10
复制代码

  当默认字符集/排序方式为latin1时,修改配置文件中遇到的问题集锦:

  2.1)MySQL默认字符集,客户端、服务器端均设置为gbk

  [mysql] default-charactter-set=gbk     [mysqld] default-set-server=gbk

  关闭MySQL服务后,再次启动MySQL服务正常。但是输入SQL语句SELECT * FROM XXX后显示的仍然为乱码。

  2.2)MySQL默认字符集,客户端设置为utf-8,服务器设置为gbk

  [mysql] default-charactter-set=utf-8    [mysqld] default-set-server=gbk

  关闭MySQL服务后,再次启动MySQL服务正常。但是在进入命令行客户端时报错,报错信息如下所示:

复制代码
mysql: Character set 'utf-8' is not a compiled character set and is not specified in the 'C:\Program Files\MySQL\MySQL Server 5.5\share\charsets\Index.xml' file ERROR 2019 (HY000): Can't initialize character set utf-8 (path: C:\Program Files\MySQL\MySQL Server 5.5\share\charsets\)
mysql客户端(即用mysql -u root -p登录的客户端):字符集'utf-8'非已编译过字符集,在Index.xml配置文件中没有被指定。错误的原因是无法初始化'utf-8'。
复制代码

  2.3)MySQL默认字符集,客户端设置为utf-8,服务器设置为utf-8

  [mysql] default-charactter-set=utf-8    [mysqld] default-set-server=utf-8

  关闭MySQL服务后,再次尝试启动MySQL服务,此时无法启动Windows MySQL服务,出现错误1067。连查询的是否为乱码的机会都没有给。

MySQL服务启动失败

  2.1~2.3问题分析详见 MySQL预编译字符集问题

  注意:本文所有修改配置文件的问题都是基于在修改配置文件重新启动(先关闭,再启动。启动的方式手动或自动)MySQL服务(即启动mysqld程序)。如下图所示:

MySQL服务

  3. 命令行修改MySQL字符集

  如果只需临时使用MySQL,还可以在命令行临时修改配置。这种方式在每次重新启动命令行后都必须重新修改,因此不推荐。google搜索出来的解决方案,很大一部分采用这种治标不治本的方法,当然这也不失为一种解决方案,因此文本也将其列为一种方法。再次强调:本文不推荐此方法。

四、修改配置文件问题及解决方案

  1. 修改配置文件my.ini权限问题

  在修改完毕后,保存过程中出现"拒绝访问"问题。由于MySQL默认被安装在C盘,因此首先查看了权限,发现权限是运行写入的。就在这时候灵机一动,大不了把文件移到桌面修改,改完之后再放到相应文件夹下,这就省事多了。

  2. MySQL预编译字符集问题

   如果用默认的安装,即默认的字符集为latin1时,诸如gbk和utf-8在Index.xml是没有被定义的。当时我在没有重新配置MySQL前,就想在网上下载一份utf-8的Index.xml,可惜没找到。当经过我重新配置MySQL后,采用utf-8后,有了utf-8和gbk等字符集。采用utf-8后Index.xml如下所示情况。

 Index.xml 

五、思考总结

  经过大致3~4天的理论积累以及实践操作,终于完成了这篇文章。可以这么说吧,这篇博客可能是我查询文献最多以及写作时间最长的一篇。处女座的我,最受不了网上那些只告诉你这么干,不告诉为什么这么干的,或者只是照搬照抄没有探索精神的文章。写下本文望能与后来者共勉。

  文章的排版可能不是特别合理,因为一直没有搞定博客园html的跳转问题,略微抱歉。

  1. 字符编码

  utf-8字符集包含GBK字符集,但是这种包含关系并不是说utf-8的字符集包含的GBK字符集完全是一致的,而是指GBK的所有字符集都能够在utf-8中找到相应的映射。例如,在GBK中中文字符占2字节,而在变长字符集utf-8中中文字符占3字节。不同字符集在MySQL数据管理系统内部能够自动映射,但是在客户端中显示时必须匹配合适的字符编码集,否则无法正确显示,即出现乱码问题。

  2. mysql与mysqld区别

  mysql指客户端;mysqld=mysql daemon指mysql守护进程,即mysql后台服务器端。当我们在命令行输入mysqld -install后,即安装完成mysqld,此时在服务中出现MySQL服务。启动MySQL服务,等价于启动mysqld,即启动mysql服务器。此后,才能在mysql客户端登陆操作mysql数据库。

  3. 数据管理系统字符集层次

  MySQL数据库字符集具有多层次。在配置文件my.ini中仅定义default-character-set、default-set-server,然而MySQL服务器中却存在多层次的字符集结构。

  character-set-client 客户端发送给服务器SQL语句字符集

  character-set-connection sokect连接字符集

  character-set-results 客户端通过SELECT语句显示数据库查询结果字符集

  这三种字符集一般是与default-character-set字符集相同的。当然也可以自定义设置。

  character-set-database 数据库储存的数据字符集

  character-set-server 服务器字符集

  character-set-system 系统字符集

  这三种字符集一般是与default-set-server字符集相同的。当然也可以自定义设置。

  character-set-filesystem 文件系统字符集

MySQL数据库字符集

  可以通过在命令行输入 SHOW variables like '%char%'; 显示上述图所示类似内容。

(责任编辑:好模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容