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%'; 显示上述图所示类似内容。 (责任编辑:好模板) |