1. 程式人生 > >mac下關於MySQL編碼的問題

mac下關於MySQL編碼的問題

背景

因為Mac的dmg檔案在安裝過程中並沒有選擇編碼的步驟,而是預設的編碼Latein1的格式,導致了中文亂碼的問題。到網上也查詢了不少,一些細節需要注意。

一、修改.cnf檔案。

在etc目錄下面新建一個cnf檔案:my.cnf 
cd /etc
vim my.cnf //沒有這個檔案會新建,若有就會開啟進行修改。
新增編碼內容:
# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon # doesn't use much resources. # # MySQL programs look for option files in a set of # locations which depend on the deployment platform. # You can copy this option file to one of those # locations. For information about these locations, see:
# http://dev.mysql.com/doc/mysql/en/option-files.html # # In this file, you can use all long options that a program supports. # If you want to know which options a program supports, run the program # with the "--help" option. # The following options will be passed to all MySQL clients [client] default-character-set
=utf8 #主要是這個內容1️⃣ #password = your_password port = 3306 socket = /tmp/mysql.sock # Here follows entries for some specific programs # The MySQL server [mysqld] default-storage-engine=INNODB character-set-server=utf8 #主要是這個2️⃣ collation-server=utf8_general_ci port = 3306 socket = /tmp/mysql.sock skip-external-locking key_buffer_size = 16K max_allowed_packet = 1M table_open_cache = 4 sort_buffer_size = 64K read_buffer_size = 256K read_rnd_buffer_size = 256K net_buffer_length = 2K thread_stack = 128K # Don't listen on a TCP/IP port at all. This can be a security enhancement, # if all processes that need to connect to mysqld run on the same host. # All interaction with mysqld must be made via Unix sockets or named pipes. # Note that using this option without enabling named pipes on Windows # (using the "enable-named-pipe" option) will render mysqld useless! # #skip-networking server-id = 1 # Uncomment the following if you want to log updates #log-bin=mysql-bin # binary logging format - mixed recommended #binlog_format=mixed # Causes updates to non-transactional engines using statement format to be # written directly to binary log. Before using this option make sure that # there are no dependencies between transactional and non-transactional # tables such as in the statement INSERT INTO t_myisam SELECT * FROM # t_innodb; otherwise, slaves may diverge from the master. #binlog_direct_non_transactional_updates=TRUE # Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = /usr/local/mysql/data #innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = /usr/local/mysql/data # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high #innodb_buffer_pool_size = 16M #innodb_additional_mem_pool_size = 2M # Set .._log_file_size to 25 % of buffer pool size #innodb_log_file_size = 5M #innodb_log_buffer_size = 8M #innodb_flush_log_at_trx_commit = 1 #innodb_lock_wait_timeout = 50 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash # Remove the next comment character if you are not familiar with SQL #safe-updates [myisamchk] key_buffer_size = 8M sort_buffer_size = 8M [mysqlhotcopy] interactive-timeout

注意:然後英文狀態下輸入I ,然後:wq儲存退出
這個時候需要重啟MySQL服務。
重啟方式:兩種
一、命令列方式:

啟動MySQL服務
sudo /usr/local/MySQL/support-files/mysql.server start

停止MySQL服務
sudo /usr/local/mysql/support-files/mysql.server stop

重啟MySQL服務
sudo /usr/local/mysql/support-files/mysql.server restart

二、圖形介面 —-偏好設定
通過偏好設定MySQL

重啟之後,MySQL載入了配置檔案。通過兩種方式可以檢視編碼形式

1.登入到MySQL中:mysql -uroot -p之採用:status;命令檢視編碼方式

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.22, for macos10.13 (x86_64) using  EditLine wrapper

Connection id:      4
Current database:   p2p
Current user:       [email protected]
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.22 MySQL Community Server (GPL)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /tmp/mysql.sock
Uptime:         1 hour 13 min 28 sec

2.採用看變數的方式:show variables like ‘%char%’;

mysql> show variables like '%char%';
+--------------------------+-----------------------------------------------------------+
| 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/local/mysql-5.7.22-macos10.13-x86_64/share/charsets/ |
+--------------------------+-----------------------------------------------------------+
8 rows in set (0.00 sec)

比較兩種方法:第一種方法不能夠把全部的編碼顯示出來但是顯示出來了資料庫名稱這樣能夠清晰。我再做的過程中發現,修改配置檔案之後,然後再去重啟伺服器,重新登入到資料庫之後,然後再使用我之前的資料庫進行插入到表包含中文的時候仍然報錯。

mysql> use goods ;
Database changed
mysql> insert into employee values(null,'張三','[email protected]','1990-08-23','hr','ddd');
ERROR 1366 (HY000): Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'ename' at row 1
mysql> mysql> insert into employee values(null,'lisi','[email protected]','1990-08-23','hr','ddd');

這是因為當時新建goods資料庫的時候預設的編碼就是Latin1導致的
如下:


mysql> use goods;
Database changed
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.22, for macos10.13 (x86_64) using  EditLine wrapper

Connection id:      4
Current database:   goods
Current user:       [email protected]
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.22 MySQL Community Server (GPL)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /tmp/mysql.sock
Uptime:         1 hour 19 min 39 sec

Threads: 2  Questions: 43  Slow queries: 0  Opens: 124  Flush tables: 1  Open tables: 0  Queries per second avg: 0.008
--------------

如果退出MySQL再重新登入去檢視編碼:

mysql> exit;
Bye
liukunlun-mbp:etc liukunlun$ 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.22, for macos10.13 (x86_64) using  EditLine wrapper

Connection id:      703
Current database:   
Current user:       [email protected]
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.22 MySQL Community Server (GPL)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /tmp/mysql.sock
Uptime:         1 hour 21 min 26 sec

Threads: 2  Questions: 48  Slow queries: 0  Opens: 124  Flush tables: 1  Open tables: 0  Queries per second avg: 0.009
--------------

mysql> show variables like '%char%';
+--------------------------+-----------------------------------------------------------+
| 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/local/mysql-5.7.22-macos10.13-x86_64/share/charsets/ |
+--------------------------+-----------------------------------------------------------+
8 rows in set (0.01 sec)

這樣預設的編碼都是utf-8了,這樣新建的資料庫 預設的就是utf-8了
執行中文沒有問題了:

mysql> insert into employee values(null,'李四','[email protected]');
Query OK, 1 row affected (0.00 sec)

mysql> select * from employee;
+-----+--------+-------------+
| eid | ename  | email       |
+-----+--------+-------------+
|   1 | 李四   | [email protected] |
+-----+--------+-------------+
1 row in set (0.00 sec)

總結

Mac有的在support-files中並沒有預設的default-*.cnf檔案,沒有關係的 直接在etc的根目錄下面建立這個檔案就行了。

目前沒有解決的問題是:如果修改已經建立的資料庫的編碼(新建的資料庫編碼都是utf-8的了)。原來建立的還是Latin1的格式;

mysql> use goods;
Database changed
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.22, for macos10.13 (x86_64) using  EditLine wrapper

Connection id:      703
Current database:   goods
Current user:       [email protected]
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.22 MySQL Community Server (GPL)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /tmp/mysql.sock
Uptime:         1 hour 29 min 29 sec

Threads: 2  Questions: 54  Slow queries: 0  Opens: 125  Flush tables: 1  Open tables: 0  Queries per second avg: 0.010
--------------