Tại sao ký tự mặc định_set_server là latin1?


12

Tôi đang sử dụng MySQL 5.5 và khi tôi hiển thị các biến về bộ ký tự, tôi có

+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

Tôi có nên thay đổi character_set_databasecharacter_set_serverđể utf8?

Câu trả lời:


8

Hãy suy nghĩ về nó:

  • Bạn đang lưu trữ dữ liệu trong cơ sở dữ liệu như latin1
  • Bạn là dữ liệu được xử lý nội bộ bởi mysqld như latin1

Nếu dữ liệu đến từ HĐH hoặc từ kết nối utf8, mysqld sẽ xử lý nó như thế nào?

Thay vì đoán hoặc hy vọng điều tốt nhất, bạn có thể thay đổi hành vi của bộ ký tự đến. Ngoại trừ information_schemamysql, lấy tất cả cơ sở dữ liệu của bạn và đặt bộ ký tự mặc định thành utf8:

ALTER DATABASE dbname CHARACTER SET utf8;

Nếu bạn có một hợp đồng cụ thể để đi cùng với nó, hãy làm điều này:

ALTER DATABASE dbname COLLATE 'utf8_general_ci';

Dưới đây là các bộ sưu tập để lựa chọn:

mysql> select * from information_schema.collations where CHARACTER_SET_NAME = 'utf8';
+--------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME     | CHARACTER_SET_NAME | ID  | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci    | utf8               |  33 | Yes        | Yes         |       1 |
| utf8_bin           | utf8               |  83 |            | Yes         |       1 |
| utf8_unicode_ci    | utf8               | 192 |            | Yes         |       8 |
| utf8_icelandic_ci  | utf8               | 193 |            | Yes         |       8 |
| utf8_latvian_ci    | utf8               | 194 |            | Yes         |       8 |
| utf8_romanian_ci   | utf8               | 195 |            | Yes         |       8 |
| utf8_slovenian_ci  | utf8               | 196 |            | Yes         |       8 |
| utf8_polish_ci     | utf8               | 197 |            | Yes         |       8 |
| utf8_estonian_ci   | utf8               | 198 |            | Yes         |       8 |
| utf8_spanish_ci    | utf8               | 199 |            | Yes         |       8 |
| utf8_swedish_ci    | utf8               | 200 |            | Yes         |       8 |
| utf8_turkish_ci    | utf8               | 201 |            | Yes         |       8 |
| utf8_czech_ci      | utf8               | 202 |            | Yes         |       8 |
| utf8_danish_ci     | utf8               | 203 |            | Yes         |       8 |
| utf8_lithuanian_ci | utf8               | 204 |            | Yes         |       8 |
| utf8_slovak_ci     | utf8               | 205 |            | Yes         |       8 |
| utf8_spanish2_ci   | utf8               | 206 |            | Yes         |       8 |
| utf8_roman_ci      | utf8               | 207 |            | Yes         |       8 |
| utf8_persian_ci    | utf8               | 208 |            | Yes         |       8 |
| utf8_esperanto_ci  | utf8               | 209 |            | Yes         |       8 |
| utf8_hungarian_ci  | utf8               | 210 |            | Yes         |       8 |
| utf8_sinhala_ci    | utf8               | 211 |            | Yes         |       8 |
+--------------------+--------------------+-----+------------+-------------+---------+
22 rows in set (0.03 sec)

Bạn cũng có thể chạy

mysql> show collation where charset='utf8';
+--------------------+---------+-----+---------+----------+---------+
| Collation          | Charset | Id  | Default | Compiled | Sortlen |
+--------------------+---------+-----+---------+----------+---------+
| utf8_general_ci    | utf8    |  33 | Yes     | Yes      |       1 |
| utf8_bin           | utf8    |  83 |         | Yes      |       1 |
| utf8_unicode_ci    | utf8    | 192 |         | Yes      |       8 |
| utf8_icelandic_ci  | utf8    | 193 |         | Yes      |       8 |
| utf8_latvian_ci    | utf8    | 194 |         | Yes      |       8 |
| utf8_romanian_ci   | utf8    | 195 |         | Yes      |       8 |
| utf8_slovenian_ci  | utf8    | 196 |         | Yes      |       8 |
| utf8_polish_ci     | utf8    | 197 |         | Yes      |       8 |
| utf8_estonian_ci   | utf8    | 198 |         | Yes      |       8 |
| utf8_spanish_ci    | utf8    | 199 |         | Yes      |       8 |
| utf8_swedish_ci    | utf8    | 200 |         | Yes      |       8 |
| utf8_turkish_ci    | utf8    | 201 |         | Yes      |       8 |
| utf8_czech_ci      | utf8    | 202 |         | Yes      |       8 |
| utf8_danish_ci     | utf8    | 203 |         | Yes      |       8 |
| utf8_lithuanian_ci | utf8    | 204 |         | Yes      |       8 |
| utf8_slovak_ci     | utf8    | 205 |         | Yes      |       8 |
| utf8_spanish2_ci   | utf8    | 206 |         | Yes      |       8 |
| utf8_roman_ci      | utf8    | 207 |         | Yes      |       8 |
| utf8_persian_ci    | utf8    | 208 |         | Yes      |       8 |
| utf8_esperanto_ci  | utf8    | 209 |         | Yes      |       8 |
| utf8_hungarian_ci  | utf8    | 210 |         | Yes      |       8 |
| utf8_sinhala_ci    | utf8    | 211 |         | Yes      |       8 |
+--------------------+---------+-----+---------+----------+---------+
22 rows in set (0.00 sec)

mysql>

Để xem bộ ký tự riêng lẻ của cơ sở dữ liệu chạy này:

mysql> show create database sample;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| sample   | CREATE DATABASE `sample` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

Đối với các cài đặt, bạn có thể thử điều này:

Thêm các dòng vào my.cnf

[mysqld]
character_set_database=utf8
character_set_server=utf8

sau đó khởi động lại mysql

Tôi đã thảo luận điều này trở lại vào ngày 01 tháng 8 năm 2011: Mã hóa bộ ký tự trong bảng

CAVEAT (Dành cho Máy chủ DB DB trong Windows)

Những lệnh này

ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';

không hoạt động trong phiên bản Windows của MySQL vì cách Windows khóa các tệp. Các tập tin cần thiết được gọi db.optlà nằm trong thư mục con cơ sở dữ liệu trong datadir.

Bạn có thể phải làm như sau:

  • mysqldump cơ sở dữ liệu đó (không có cơ sở dữ liệu tạo thông tin, chỉ tạo bảng và INSERT)
  • bỏ cơ sở dữ liệu đó
  • tạo cơ sở dữ liệu với bộ ký tự cụ thể và đối chiếu
  • tải lại trong bãi chứa vào nó

TIẾNG VIỆT

Bất kể bạn làm gì, vui lòng thực hiện bất kỳ thay đổi nào trên Máy chủ Dev / Staging để xem bạn có đạt được hiệu ứng mong muốn không

CẬP NHẬT 2012-12-05 11:00 EDT

Những câu hỏi của bạn

Tôi có nên thực sự thay đổi nó?

Để đảm bảo việc xử lý dữ liệu đúng cách, bạn có thể muốn đảm bảo rằng bạn có táo. Dữ liệu được chuẩn bị dưới dạng một bộ ký tự và tải nó vào một bảng với cơ sở dữ liệu có thể sắp xếp dữ liệu như thể nó thấy một bộ ký tự khác có thể sẽ không hiển thị dữ liệu với bộ ký tự mysqld nhìn thấy khi được truy xuất và gửi lại cho Kết nối DB. Hãy thử tải cơ sở dữ liệu trên Máy chủ Dev / Staging và thử nghiệm cài đặt bộ ký tự mặc định.

Tại sao một số mặc định sử dụng utf8nhưng một số sử dụng mặc định latin1?

Điều này phụ thuộc vào phiên bản HĐH của Binary MySQL. Phiên bản Windows có thể có latin1trong khi Phiên bản Linux có thể sử dụng utf8.


Xin chào, cảm ơn bạn đã trả lời chi tiết. Thật ra câu hỏi của tôi không phải là về cách thay đổi nó, mà là ... 1. Tôi có nên thực sự thay đổi nó không? 2. Tại sao một số mặc định sử dụng utf8 nhưng một số mặc định sử dụng latin1
Yoga

1
(cảm ơn lần nữa trước) Điều này phụ thuộc vào phiên bản HĐH của Binary MySQL. <- Ý tôi là khi tôi ở trên Ubuntu, tại sao mặc định được trộn lẫn giữa latin1utf8, ví dụ như character_set_connectionutf8 nhưng character_set_databaselà latin1
Yoga

1
@Rolando [mysqld] character_set_database=utf8 character_set_server=utf8không hoạt động.
Jorge B.

Tôi vẫn không hiểu ... ngay cả khi HĐH máy chủ sử dụng một bộ ký tự giới hạn ngớ ngẩn, không nên cơ sở dữ liệu theo mặc định lưu trữ văn bản trong bộ ký tự có thể đại diện cho bất kỳ ký tự nào, ngay cả khi nó chấp nhận đầu vào latin1và phải chuyển đổi nó để lưu trữ?
Andy
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.