Lỗi MySQL trên Windows tự động convert table name sang lowercase

Lỗi MySQL trên Windows tự động convert table name sang lowercase

Gần đây khi dự án chuẩn bị release dự án, thì có 1 lỗi xảy ra mà chỉ khi upload lên test server của Khách hàng thì mới phát hiện ra được, gây ảnh hưởng đến tiến độ dự án.

Hiện tượng

Codebase của KH từ khá lâu rồi, khi mà khái niệm tuân thủ convention là chưa có, có những bảng có tên chứa cả snake_case, camelCase. Ở đây tôi VD như bảng có tên là myTable ở trong dump file được export ra từ server (Linux)

CREATE TABLE `myTable` ...

Phía develop client(window), restore lại bằng Workbench thì phát hiện ra tên bảng được restore ra lại trở thành mytable

Tìm hiểu nguyên nhân

Cố gắng phán đoán tình huống, tôi nghĩ có thể đây là 1 tính năng hay config nào đó của MySQL nên thử tìm kiểu và thấy tài liệu này
https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html

In MySQL, databases correspond to directories within the data directory. Each table within a database corresponds to at least one file within the database directory (and possibly more, depending on the storage engine). Triggers also correspond to files. Consequently, the case sensitivity of the underlying operating system plays a part in the case sensitivity of database, table, and trigger names. This means such names are not case-sensitive in Windows, but are case-sensitive in most varieties of Unix.

Nghĩa là sự phân biệt chữ hoa, chữ thường trên OS có liên quan đến sự phân biệt chữ hoa chữ thường của tên database, table, trigger.
Trên máy Windows thì sẽ không phân biệt, còn Unix thì có, đấy là lý do tại sao máy client của tôi restore thì tên bảng lại trở thành mytable thay vì myTable, sau cùng dẫn đến code gây lỗi.

Khắc phục

Trên máy windows thì sửa lại config của mysql là để nó trở nên phân biệt chữ cái là viết hoa hay viết thường, giả sử bạn đang dùng xampp server để chạy

  • Mở MySQL configuration file: [drive]\xampp\mysql\bin\my.ini
  • Tìm đoạn: # The MySQL server [mysqld]
  • Thêm dòng này vào dưới: lower_case_table_names = 2
  • save file and khởi động lại MySQL