Thay đổi ký tự mặc định của MySQL được đặt thành UTF-8 trong my.cnf?


334

Hiện tại chúng tôi đang sử dụng các lệnh sau trong PHP để đặt bộ ký tự thành UTF-8 trong ứng dụng của chúng tôi.

Vì đây là một chút chi phí, chúng tôi muốn đặt cài đặt này làm cài đặt mặc định trong MySQL. Chúng tôi có thể làm điều này trong /etc/my.cnf hoặc ở một vị trí khác không?

SET NAMES 'utf8'
SET CHARACTER SET utf8

Tôi đã tìm kiếm một bộ ký tự mặc định trong /etc/my.cnf, nhưng không có gì về bộ ký tự.

Tại thời điểm này, tôi đã làm như sau để đặt bộ ký tự và biến đối chiếu của MySQL thành UTF-8:

skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8

Đó có phải là một cách chính xác để xử lý việc này?


19
Lưu ý rằng một mặc định tốt hơn sẽ là utf8mb4, tức là UTF-8 thực sự với sự hỗ trợ Unicode đầy đủ. Xem Cách hỗ trợ Unicode đầy đủ trong cơ sở dữ liệu MySQL .
Mathias Bynens

@Jorre bạn có phản đối việc thay đổi điều này thành utf8mb4loại tiền lệ nguy hiểm như nó không?
Evan Carroll

Câu trả lời:


424

Để đặt mặc định thành UTF-8, bạn muốn thêm phần sau vào my.cnf

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

Nếu bạn muốn thay đổi bộ ký tự cho một DB hiện có, hãy cho tôi biết ... câu hỏi của bạn không chỉ định trực tiếp vì vậy tôi không chắc đó có phải là điều bạn muốn làm không.


18
Các cài đặt my.cnf ở trên cũng làm việc cho tôi. Ngoài ra, tôi phải đảm bảo rằng bảng đã được đặt đúng, chẳng hạn như ALTER TABLE TableCHUYỂN ĐỔI ĐỂ CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Chris Livdahl

8
Không hoạt động cho mysql 5.5. Tôi đã sử dụng: <br/> [mysqld] # Thay đổi cho utf-8 collation-server = utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' character-set-server = utf8mb4 và utf8mb4 ở những nơi khác như đã đề cập ở trên.
Champ

12
Trên Ubuntu 12.04, điều này làm việc với tôi - nếu tôi xóa dòng đầu tiên sau [mysqld].
Brandon Bertelsen

4
Có vẻ như bộ ký tự mặc định không còn được cho phép trong phần [mysqld]
marsbard 24/03/13

4
Lưu ý rằng nếu UTF-8 là những gì bạn muốn, đừng sử dụng bộ utf8ký tự của MySQL . Sử dụng utf8mb4thay thế.
Mathias Bynens

255

Đối với phiên bản gần đây của MySQL,

default-character-set = utf8

gây ra một vấn đề Tôi nghĩ đó là sự phản đối.

Như Justin Ball đã nói trong " Nâng cấp lên MySQL 5.5.12 và bây giờ MySQL sẽ không bắt đầu , bạn nên:

  1. Hủy bỏ chỉ thị đó và bạn sẽ được tốt.

  2. Sau đó, tệp cấu hình của bạn (ví dụ '/etc/my.cnf') sẽ trông như thế:

    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
  3. Khởi động lại MySQL.

  4. Để đảm bảo, MySQL của bạn là UTF-8, hãy chạy các truy vấn sau trong dấu nhắc MySQL của bạn:

    • Truy vấn đầu tiên:

       mysql> show variables like 'char%';

      Đầu ra sẽ giống như:

       +--------------------------+---------------------------------+
       | 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/share/charsets/|
       +--------------------------+---------------------------------+
    • Truy vấn thứ hai:

       mysql> show variables like 'collation%';

      Và đầu ra truy vấn là:

       +----------------------+-----------------+
       | Variable_name        | Value           |
       +----------------------+-----------------+
       | collation_connection | utf8_general_ci |
       | collation_database   | utf8_unicode_ci |
       | collation_server     | utf8_unicode_ci |
       +----------------------+-----------------+

Dòng đầu tiên của bạn max_allowed_packet = 64M có liên quan đến vấn đề UTF8 này theo bất kỳ cách nào không?
malhal

Tôi có character_set_filesystem | utf8. Tôi không chắc lắm, có ổn không?
chú Lem

1
Đã thử trên MariaDB v5.5 và nó hoạt động, cảm ơn! mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
cenk

Tôi nghĩ rằng bạn không cần phải xóa default-character-set, thay vào đó bạn có thể thay đổi thành loose-default-character-set = utf8- đó là tiền tố với 'lỏng lẻo'. Điều này làm cho mysqlbinloghạnh phúc, nếu bạn cần sử dụng nó - google for: "mys -bin-default-character-set" mysqlbinlog .
KajMagnus

init-connect='SET NAMES utf8'thực sự cần thiết? Nếu không chúng tôi chắc chắn có thể làm mà không có nó cho hiệu suất.
datan.io

56

Câu hỏi này đã có rất nhiều câu trả lời, nhưng Mathias Bynens đã đề cập rằng 'utf8mb4' nên được sử dụng thay vì 'utf8' để có hỗ trợ UTF-8 tốt hơn ('utf8' không hỗ trợ các ký tự 4 byte, các trường được cắt bớt khi chèn ). Tôi coi đây là một sự khác biệt quan trọng. Vì vậy, đây là một câu trả lời khác về cách đặt bộ ký tự và đối chiếu mặc định. Một cái sẽ cho phép bạn chèn một đống poo ().

Điều này hoạt động trên MySQL 5.5.35.

Lưu ý rằng một số cài đặt có thể là tùy chọn. Vì tôi không hoàn toàn chắc chắn rằng mình chưa quên bất cứ điều gì, tôi sẽ biến câu trả lời này thành wiki cộng đồng.

Cài đặt cũ

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

Cấu hình

# 💩 𝌆
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

Cài đặt mới

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

character_set_system luôn là utf8 .

Điều này sẽ không ảnh hưởng đến các bảng hiện có, nó chỉ là cài đặt mặc định (được sử dụng cho các bảng mới). Mã ALTER sau đây có thể được sử dụng để chuyển đổi một bảng hiện có (không có cách giải quyết khôi phục kết xuất):

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Biên tập:

Trên máy chủ MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection vẫn duy trì ở latin1. Phát hành SET NAMES utf8(utf8mb4 không có sẵn trong phiên bản đó) cũng đặt những thứ đó thành utf8.


Hãy cẩn thận : Nếu bạn có bảng utf8 với cột chỉ mục loại VARCHAR (255), thì không thể chuyển đổi nó trong một số trường hợp, vì độ dài khóa tối đa bị vượt quá ( Specified key was too long; max key length is 767 bytes.). Nếu có thể, hãy giảm kích thước cột từ 255 xuống 191 (vì 191 * 4 = 764 <767 <192 * 4 = 768). Sau đó, bảng có thể được chuyển đổi.


Tôi đã làm theo cài đặt của bạn, nhưng tôi thấy character_set_databasevẫn còn utf8collation_databaselà utf8_bin`. Tôi đã bỏ lỡ một cái gì đó?
Stewart

Tìm thấy những gì tôi bỏ lỡ. Hai cài đặt này được đặt khi cơ sở dữ liệu được tạo. Xem câu hỏi này; stackoverflow.com/questions/22572558/ Mạnh
Stewart

1
thêm character-set-client-handshake = FALSEvào phần [mysqld], vì vậy nó sẽ luôn sử dụng mã hóa mặc định ngay cả khi bạn sẽ mắc lỗi trên lớp ứng dụng
Lukas Liesis

xin chào, tôi đã thử giải pháp này nhưng tôi vẫn không thể hiển thị character_set_client | utf8mb4. đó là utf8. chỉ character_set_database utf8mb4 và character_set_server utf8mb4 là utf8mb4 khác không thay đổi. Xin hãy giúp tôi
Bhavin Chauhan

@ baic6 Tôi đề nghị thêm một ghi chú làm rõ lý do tại sao chỉ các cột được lập chỉ mục có thể gây ra sự cố. Giới hạn 767 byte chỉ dành cho các cột được lập chỉ mục, vì đó là giới hạn cho "khóa". Đối với các cột không được lập chỉ mục nói chung, điều này không áp dụng. Nếu một cột có giá trị với độ dài byte tối đa, giả sử 255 ký tự và 3 byte tối đa của utf8 đã được sử dụng, thì nó vẫn chỉ cần 255 * 3 byte, trong những trường hợp này sẽ chỉ sử dụng 3 byte, vì các ký tự này trong utf8mb4 cũng vậy chỉ cần 3 byte. Đó là, trừ khi một ký tự không phù hợp trong utf8 được lưu trữ vào cột trong trường hợp thông tin đã bị mất.
sam

55

Trên MySQL 5.5 tôi có trong my.cnf

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Kết quả là

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| 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/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

2
Điều gì skip-character-set-client-handshakelàm chính xác và trong những trường hợp được yêu cầu?
Simon East

3
@Simon, khi sử dụng show variables like "%collation%";tôi đã thấy 'collation_connection' là utf8_general_civà collation_database và collation_server là utf8_unicode_ci. Việc thêm dòng skip-character-set-client-handshakeđã thay đổi mục nhập chung thành unicode, vì vậy cả ba đều nhất quán.
Vaughany

2
Trên MySQL 5.6, cái bắt tay bỏ qua bộ ký tự-bộ-máy khách không làm được những gì @Vaughany nói. Bất cứ đề nghị nào?
Ababneh

4
Tất skip-character-set-client-handshakenhiên, nó đã làm điều đó cho tôi (cùng với "bộ ký tự-máy chủ" và "máy chủ đối chiếu", trên Debian 7). Các init_connects không tạo ra sự khác biệt có hoặc không có skipvà có vẻ dư thừa. +1 và cảm ơn bạn.
Jeff

3
Skip-character-set-client-handshake bỏ qua thông tin bộ ký tự được gửi bởi máy khách. Thật tốt khi buộc một bộ ký tự cụ thể trong quá trình giao tiếp, nhưng nếu khách hàng đang mong đợi một cái gì đó khác, nó có thể dẫn đến các vấn đề. Tôi muốn nói rằng bạn tốt hơn nên chỉ định điều này trên máy khách (ứng dụng của bạn).
0b10011

31

Lưu ý: tập tin my.cnf được đặt tại/etc/mysql/

Sau khi thêm các dòng này:

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake

[client]
default-character-set   = utf8

[mysql]
default-character-set   = utf8

Đừng quên khởi động lại máy chủ:

sudo service mysql restart

2
Lưu ý: Điều này thay đổi mặc định; nó không thay đổi mã hóa cho bất kỳ cột hiện có.
Rick James

24

NijaCat đã gần, nhưng chỉ định quá mức cần thiết:

Để đặt mặc định thành UTF-8, bạn muốn thêm phần sau vào my.cnf

[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8

Sau đó, để xác minh:

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| 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/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

5
Câu trả lời tốt đẹp. Có lẽ một lời giải thích ngắn gọn về những phần quá mức sẽ giúp mọi người quyết định chính xác những gì họ muốn trong cấu hình của họ.
Mike Samuel

@Derek, [mysql] default-character-set=utf8sau đó làm gì?
Pacerier

1
Nhóm tùy chọn [client] đã thiết lập các tùy chọn cho tất cả các máy khách MySQL đọc tệp my.cnf. Nhóm [mysql] thiết lập các tùy chọn cho chỉ nhị phân máy khách "mysql". Nếu bạn muốn đặt tùy chọn mysql không áp dụng cho các máy khách khác, sử dụng nhóm này là phù hợp, nhưng việc đặt cùng một giá trị tùy chọn ở cả hai vị trí là không cần thiết. dev.mysql.com/doc/refman/5.6/en/option-files.html
Derek

@Mike Samuel, đặt ký tự mặc định được đặt thành utf8 đã ngụ ý chế độ đối chiếu mặc định của utf8_general_ci. Mặt khác, "init-connect = 'SET NAMES utf8'" là một ý tưởng khá thú vị, vì nó cố gắng buộc tất cả các máy khách kết nối với máy chủ sử dụng utf8, nhưng điều này được áp dụng không nhất quán tùy thuộc vào đặc quyền kết nối của kết nối người dùng và tôi nghi ngờ rằng một số máy khách bên thứ ba kết nối có thể bị nhầm lẫn khi máy chủ ghi đè bộ ký tự họ yêu cầu. dev.mysql.com/doc/refman/5.6/en/charset-appluggest.html
Derek

Để [mysqld]sử dụng character-set-serverthay vìdefault-character-set
Rick James

23

Tôi cũng đã phát hiện ra rằng sau khi cài đặt default-character-set = utf8dưới [mysqld]tiêu đề, MySQL 5.5.x sẽ không bắt đầu dưới Ubuntu 12.04 (Precise tê tê).


16
Đó là lỗi MySQL # 52047 . Dưới [mysqld], bạn nên sử dụng character-set-serverthay vì default-character-set. (Vô cùng khó hiểu, tôi đồng ý!)
Mathias Bynens

Đúng. Không dùng nữa trong 5.0; loại bỏ trong 5.5.
Rick James

22

MySQL v5.5.3 trở lên:

Chỉ cần thêm ba dòng chỉ trong phần [mysqld]:

[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

Lưu ý: Bao gồm skip-character-set-client-handshakeở đây làm giảm nhu cầu bao gồm cả init-connecttrong [mysqld]default-character-settrong [client][mysql]các phần.


1
Wow, rất nhiều câu trả lời trùng lặp cho câu hỏi này, và đây dường như là câu trả lời đơn giản nhất. Cũng hoạt động với tôi trên v5.5.44.
Justin Watt

9

Trong Xubfox 12.04 tôi chỉ cần thêm

[mysqld]
character_set_server = utf8

đến /etc/mysql/my.cnf

Và kết quả là

mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| 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/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

Ngoài ra, hãy xem http://dev.mysql.com/doc/refman/5.6/en/charset-server.html


Bạn cũng cần [client] default-character-set = utf8 nếu không, khi bạn sử dụng mysql tại dòng lệnh, nó sẽ không sử dụng utf8 có khả năng phá hủy mọi bản sao lưu mà bạn đặt vào tệp.
malhal

9

Tất cả các cài đặt được liệt kê ở đây là chính xác, nhưng đây là giải pháp tối ưu và đầy đủ nhất:

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

Thêm chúng vào /etc/mysql/my.cnf.

Xin lưu ý, tôi chọn loại đối chiếu utf8_unicode_ci do vấn đề hiệu suất.

Kết quả là:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| 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/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

Và đây là khi bạn kết nối với tư cách là người dùng không SIÊU !

Ví dụ: sự khác biệt giữa kết nối là người dùng SUPER và người dùng không phải SUPER (tất nhiên trong trường hợp utf8_unicode_ci đối chiếu ):

người dùng với SUPER private.:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | <---
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

người dùng không riêng tư :

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

Tôi đã viết một bài viết toàn diện (rus) giải thích chi tiết tại sao bạn nên sử dụng một hoặc tùy chọn khác. Tất cả các loại Bộ ký tựBộ sưu tập được xem xét: cho máy chủ, cho cơ sở dữ liệu, cho kết nối, cho bảng và thậm chí cho cột.

Tôi hy vọng điều này và bài viết sẽ giúp làm rõ những khoảnh khắc không rõ ràng.


3
Tôi ước tôi có thể đọc bài viết được liên kết của bạn, nhưng không thể đọc tiếng Nga và Google dịch không hữu ích cho các văn bản kỹ thuật. Từ những gì tôi có thể nói mặc dù nó sẽ rất thú vị. Bạn có thể xem xét việc đăng một phiên bản tiếng Anh?
Martijn Heemels

2
Bạn có thể giải thích cài đặt nào không thành công đối chiếu kết nối người dùng SUPER không? (và có một giải pháp)
KCD

@gah805, Bạn nói rằng bạn sử dụng utf8_unicode_cido vấn đề hiệu suất, sau đó, tại sao không sử dụng utf8_binthay thế?
Pacerier

Xin chào, Paceriar. Điểm tốt. Bây giờ tôi không chắc liệu sự lựa chọn của tôi có đúng về việc sử dụng không utf8_unicode_ci. Không bao giờ dành thời gian kiểm tra hiệu suất.
gah khẩu


4

Phiên bản MySQL và bản phân phối Linux có thể quan trọng khi thực hiện cấu hình.

Tuy nhiên, những thay đổi dưới [mysqld]phần được khuyến khích.

Tôi muốn đưa ra một lời giải thích ngắn về câu trả lời của tomazzlender:

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

[mysqld]

Điều này sẽ thay đổi collation_connection thành utf8_unicode_ci

init_connect='SET collation_connection = utf8_unicode_ci'

Sử dụng SET NAMES:

init_connect='SET NAMES utf8'

TÊN TÊN sẽ ảnh hưởng đến ba nhân vật, đó là:

character_set_client
character_set_results
character_set_connection

Điều này sẽ thiết lập character_set_database & character_set_server

character-set-server=utf8

Điều này sẽ chỉ ảnh hưởng đến collation_database & collation_server

collation-server=utf8_unicode_ci

Xin lỗi, tôi không chắc cái này dùng để làm gì. Tôi không sử dụng nó tuy nhiên:

skip-character-set-client-handshake

Các tài liệu lưu ý character_set_serverkhông nên được đặt bằng tay.
Brian

Vậy phương pháp hiện đại là gì? Chúng tôi rõ ràng có thể vượt qua character setkhi thiết lập kết nối cơ sở dữ liệu, tuy nhiên có vẻ hơi khó chịu.
Lihang Li

Thật ra tôi đã phạm sai lầm. Các tài liệu nói rằng character_set_database không nên được đặt tự động. Không đề cập đến character_set_server. Tuy nhiên, tôi không chắc bạn cần lo lắng về character_set_server, vì tôi nghĩ nó chỉ ảnh hưởng đến giá trị mặc định cho cơ sở dữ liệu mới được tạo?
Brian

Như tôi đã đề cập ở trên và tôi đã làm lại thí nghiệm ngay bây giờ, character_set_servertrong [mysqld]phần sẽ ảnh hưởng character_set_databasecharacter_set_server. Bây giờ tôi nghĩ một cách thực hành tốt là chỉ ra một cách rõ ràng character setrằng bạn muốn sử dụng khi tạo cơ sở dữ liệu, bảng và kết nối cơ sở dữ liệu. Nói một cách trung thực, tài liệu của mysqlkhông dễ hiểu như vậy. Bạn có biết nếu có một cách chung để hoàn thành tất cả các cài đặt character setcollationcài đặt trong mysql không?
Lihang Li

4

Trên Fedora 21

$ vi /etc/my.cnf

Thêm theo:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Lưu và thoát.

Cuối cùng nhớ dịch vụ khởi động lại mysqld với service mysqld restart.


1

MySQL 5.5, tất cả những gì bạn cần là:

[mysqld]
character_set_client=utf8
character_set_server=utf8
collation_server=utf8_unicode_ci

collation_server Là tùy chọn.

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/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

1

Nếu bạn gặp sự cố khi xác nhận hỗ trợ bộ ký tự của máy khách bằng MySQL Workbench, thì hãy ghi nhớ các lưu ý sau:

Quan trọng Tất cả các kết nối được mở bởi MySQL Workbench sẽ tự động đặt ký tự máy khách thành utf8. Thay đổi thủ công bộ ký tự máy khách, chẳng hạn như sử dụng TÊN TÊN ..., có thể khiến MySQL Workbench không hiển thị chính xác các ký tự. Để biết thêm thông tin về các bộ ký tự máy khách, hãy xem Bộ ký tự và Bộ sưu tập ký tự kết nối.

Do đó, tôi không thể ghi đè các bộ ký tự của MySQL Workbench bằng các thay đổi my.cnf. ví dụ: 'đặt tên utf8mb4'


1

Nếu bạn bối rối bởi cài đặt của bạn cho máy khách và liên kết được đặt lại sau khi khởi động lại dịch vụ mysql. Hãy thử các bước sau (hoạt động với tôi):

  1. vi /etc/my.cnf
  2. thêm nội dung thổi và :wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  3. khởi động lại mysql và đăng nhập mysql, sử dụng cơ sở dữ liệu, lệnh nhập liệu status;, bạn sẽ tìm thấy bộ ký tự cho 'client' và 'Conn' được đặt thành 'utf8'.

Kiểm tra tài liệu tham khảo để biết thêm.


0

Bạn có thể làm theo cách của nó và nếu nó không hoạt động, bạn cần khởi động lại mysql.


-1

Thay đổi ký tự MySQL:

Khách hàng

default-character-set=utf8

mysqld

character_set_server=utf8

Chúng ta không nên viết default-character-set=utf8bằng mysqld, vì điều đó có thể dẫn đến một lỗi như:

bắt đầu: Công việc không bắt đầu

Cuối cùng:

 +--------------------------+----------------------------+
 | 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/share/mysql/charsets/ |
 +--------------------------+----------------------------+
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.