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

Lưu trữ dữ liệu được mã hóa base64 dưới dạng kiểu dữ liệu BLOB hoặc TEXT

Người ta không nên lưu trữ dữ liệu được mã hóa Base64 trong cơ sở dữ liệu của mình ...

Base64 là một mã hóa trong đó dữ liệu nhị phân tùy ý chỉ được biểu diễn bằng cách sử dụng các ký tự văn bản có thể in được:nó được thiết kế cho các tình huống mà dữ liệu nhị phân đó cần được chuyển qua một giao thức hoặc phương tiện chỉ có thể xử lý văn bản có thể in được (ví dụ:SMTP / email). Nó làm tăng kích thước dữ liệu (thêm 33%) và thêm chi phí tính toán của mã hóa / giải mã, vì vậy cần tránh nó trừ khi thực sự cần thiết.

Ngược lại, toàn bộ điểm của BLOB là chúng lưu trữ các chuỗi nhị phân không rõ ràng . Vì vậy, chỉ cần tiếp tục và lưu trữ nội dung của bạn trực tiếp vào BLOB của bạn các cột không có mã hóa Base64 đầu tiên. (Điều đó có nghĩa là, nếu MySQL có kiểu phù hợp hơn cho dữ liệu cụ thể đang được lưu trữ, bạn có thể muốn sử dụng kiểu đó thay thế:ví dụ:các tệp văn bản như nguồn JavaScript có thể được lợi khi được lưu trữ trong TEXT các cột mà MySQL theo dõi nguyên bản siêu dữ liệu văn bản cụ thể — thông tin thêm về điều này bên dưới).

Ý tưởng (sai lầm) rằng cơ sở dữ liệu SQL yêu cầu mã hóa văn bản có thể in được như Base64 để xử lý dữ liệu nhị phân tùy ý đã được duy trì bởi một số lượng lớn các hướng dẫn thiếu thông tin. Ý tưởng này dường như bị nhầm lẫn rằng, bởi vì SQL chỉ bao gồm văn bản có thể in được trong các ngữ cảnh khác, nó chắc chắn cũng phải yêu cầu nó đối với dữ liệu nhị phân (ít nhất là để truyền dữ liệu, nếu không phải để lưu trữ dữ liệu). Điều này đơn giản là không đúng:SQL có thể truyền tải dữ liệu nhị phân theo một số cách, bao gồm các ký tự chuỗi thuần túy (miễn là chúng được trích dẫn và thoát đúng cách như bất kỳ chuỗi nào khác); tất nhiên, cách ưa thích để chuyển dữ liệu (thuộc bất kỳ loại nào) vào cơ sở dữ liệu của bạn là thông qua các truy vấn được tham số hóa và các kiểu dữ liệu của các tham số của bạn có thể dễ dàng là chuỗi nhị phân thô như bất kỳ thứ gì khác.

... trừ khi nó được lưu vào bộ nhớ cache vì lý do hiệu suất ...

Tình huống duy nhất có thể có một số lợi ích từ việc lưu trữ dữ liệu được mã hóa Base64 là nơi dữ liệu thường được truyền qua giao thức yêu cầu mã hóa như vậy (ví dụ:bằng tệp đính kèm email) ngay lập tức sau được truy xuất từ ​​cơ sở dữ liệu — trong trường hợp đó, việc lưu trữ biểu diễn được mã hóa Base64 sẽ giúp tiết kiệm không phải thực hiện thao tác mã hóa trên dữ liệu thô sau mỗi lần tìm nạp.

Tuy nhiên, lưu ý theo nghĩa này rằng bộ nhớ được mã hóa Base64 chỉ hoạt động như một bộ nhớ đệm , giống như một người có thể lưu trữ dữ liệu không chuẩn hóa vì lý do hiệu suất.

... trong trường hợp đó nó phải là TEXT không phải BLOB

Như đã đề cập ở trên:sự khác biệt duy nhất giữa TEXTBLOB là cột, cho TEXT , MySQL cũng theo dõi siêu dữ liệu dành riêng cho văn bản (chẳng hạn như mã hóa ký tự đối chiếu ) cho bạn. Siêu dữ liệu bổ sung này cho phép MySQL chuyển đổi giá trị giữa các bộ ký tự lưu trữ và kết nối (nếu thích hợp) và thực hiện các thao tác so sánh / sắp xếp chuỗi ưa thích.

Nói chung:nếu hai khách hàng làm việc trong các bộ ký tự khác nhau sẽ thấy byte giống nhau , sau đó bạn muốn một BLOB cột; nếu họ sẽ thấy các ký tự giống nhau thì bạn muốn một TEXT cột.

Với Base64, hai ứng dụng khách đó cuối cùng phải thấy rằng dữ liệu giải mã thành các byte giống nhau ; nhưng họ sẽ thấy rằng dữ liệu được lưu trữ / mã hóa có cùng ký tự . Ví dụ:giả sử một người muốn chèn mã hóa Base64 của 'Hello world!' (là 'SGVsbG8gd29ybGQh' ). Nếu ứng dụng chèn đang hoạt động trong bộ ký tự UTF-8, thì nó sẽ gửi chuỗi byte 0x53475673624738676432397962475168 vào cơ sở dữ liệu.

  • nếu chuỗi byte đó được lưu trữ trong BLOB và sau đó được truy xuất bởi một ứng dụng đang hoạt động trong UTF-16, cùng một byte sẽ được trả lại — đại diện cho '升噳扇㡧搲㥹扇全' và không phải là giá trị được mã hóa Base64 mong muốn; trong khi

  • nếu chuỗi byte đó được lưu trữ trong một TEXT và sau đó được truy xuất bởi một ứng dụng đang hoạt động trong UTF-16, MySQL sẽ chuyển mã ngay lập tức để trả về chuỗi byte 0x0053004700560073006200470038006700640032003900790062004700510068 —Mà đại diện cho giá trị được mã hóa Base64 ban đầu 'SGVsbG8gd29ybGQh' như mong muốn.

Tất nhiên, bạn vẫn có thể sử dụng BLOB và theo dõi mã hóa ký tự theo một số cách khác — nhưng điều đó sẽ không cần thiết phải phát minh lại bánh xe, với việc bảo trì thêm phức tạp và nguy cơ gây ra lỗi không chủ ý.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn CakePHP kinh độ vĩ độ gần nhất từ ​​cơ sở dữ liệu

  2. Bảng ALTER TABLE AUTO_INCREMENT =$ x

  3. Làm cách nào để tôi có thể đặt Giá trị mặc định của cột dấu thời gian thành Dấu thời gian hiện tại với Laravel Migrations?

  4. Tạo bộ MySQL từ một chuỗi

  5. Không thể đăng văn bản lên MySQL bằng Chèn Into