Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

một cách lâu dài để thực hiện mysqli-> set_charset ()?

Bạn đã chẩn đoán chính xác sự cố cơ bản:Trong khi bạn có thể thay đổi bộ mã máy khách MySQL mặc định trong my.cnf của máy khách hoặc .my.cnf , những tệp này không được PHP sử dụng.

Nếu bạn nghĩ về cách các phần mở rộng MySQLi / MySQL của PHP hoạt động, điều này sẽ có ý nghĩa - chúng không liên quan gì đến mysql chương trình khách và sẽ không thu thập thông tin hệ thống tệp của bạn cho các tệp cấu hình, vì chúng sử dụng libmysql trực tiếp.

Để thay đổi bộ ký tự mặc định thực tế của libmysql, bạn chỉ cần xây dựng lại libmysql. Đó có thể không phải là câu trả lời bạn thích (vì bạn đang sử dụng tệp nhị phân MySQL được biên dịch trước), nhưng đó là câu trả lời thực tế. Các giá trị mặc định được đặt tại thời điểm biên dịch và sau đó có thể được ghi đè trong thời gian chạy.

Nếu bạn không muốn làm điều này và việc gọi set_charset () làm phiền bạn, đề xuất của tôi là chỉ cần mở rộng lớp MySQLi và sử dụng lớp đó thay cho mysqli. tức là:

class MyDB extends mysqli {
  // (You could set defaults for the params here if you want
  //  i.e. $host = 'myserver', $dbname = 'myappsdb' etc.)
  public function __construct($host = NULL, $username = NULL, $dbname = NULL, $port = NULL, $socket = NULL) {
    parent::__construct($host, $username, $dbname, $port, $socket);
    $this->set_charset("utf8");
  } 
} 

Thông thường, trong một ứng dụng, bạn sẽ có một số loại lớp trừu tượng cơ sở dữ liệu, vì vậy bạn có thể để lớp này sử dụng MyDB thay vì mysqli hoặc bạn có thể có lớp này be MyDB và thêm hoặc ghi đè bất kỳ phương thức nào bạn muốn (Tôi đã thực hiện việc này với các ứng dụng đơn giản không có ORM).

Một phương pháp hay là luôn có một số loại lớp trừu tượng cơ sở dữ liệu, ngay cả khi nó chỉ bắt đầu dưới dạng class MyDB extends mysqli {} bởi vì sau đó bạn sẽ không bao giờ phải tìm kiếm / thay thế toàn bộ cơ sở mã của mình để thực hiện các thay đổi nhỏ.

RE:cách giải quyết của bạn, như bạn giải thích, điều này về cơ bản là mã hóa cứng toàn bộ máy chủ db của bạn thành UTF-8 bất kể khách hàng yêu cầu gì. Thay vì có nhiều cơ sở dữ liệu, mỗi cơ sở dữ liệu có bộ ký tự riêng, máy chủ chỉ hoạt động với UTF-8 và có thể âm thầm xử lý dữ liệu nếu máy khách kết nối với bộ ký tự khác. Điều này về cơ bản là sai vì bạn đã di chuyển một cách hiệu quả một khía cạnh của cấu hình ứng dụng của mình (bộ mã cơ sở dữ liệu) từ máy ứng dụng / máy khách sang máy chủ cơ sở dữ liệu nơi nó không thực sự thuộc về.

Nếu bạn nghĩ về các lớp của ngăn xếp ứng dụng,

[server] <=> [network] <=> [client libmysql] <=> [PHP binary] <=> [app]

thì bạn sẽ hiểu rằng vị trí "chính xác" cho cấu hình dành riêng cho ứng dụng như thế này nằm trong chính ứng dụng, không phải ở nơi khác trong ngăn xếp. Bạn có thể không thích phải chỉ định bộ ký tự cơ sở dữ liệu của mình bằng PHP, nhưng nếu bạn nghĩ về nó, đó thực sự là nơi thuộc về nó, bởi vì nó cũng là nơi bạn chỉ định chính cơ sở dữ liệu mà bạn muốn kết nối - đó là một tham số kết nối, không phải là vấn đề cấu hình máy chủ. Mã hóa cứng bộ ký tự ở bất kỳ nơi nào khác làm cho ứng dụng của bạn không di động được.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách hoạt động của hàm RIGHT () trong MySQL

  2. Chuyển đổi tập lệnh MySQL sang SQL Server

  3. Cách đặt mật khẩu gốc thành null

  4. Truy vấn mySQL:Làm thế nào để chèn với UNION?

  5. làm thế nào để làm việc với truy vấn đệ quy trong MySql?