Người ta không nên lưu trữ dữ liệu được mã hóa cơ sở trong cơ sở dữ liệu của một người ...
Base64 là một mã hóa trong đó dữ liệu nhị phân tùy ý được biểu diễn chỉ bằng các ký tự văn bản có thể in: 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 [ví dụ: SMTP/email]. Nó tăng kích thước dữ liệu [lên 33%] và thêm chi phí tính toán của mã hóa/giải mã, do đó nên tránh trừ khi thực sự cần thiết.
Ngược lại, toàn bộ điểm của các cột BLOB
là chúng lưu trữ các chuỗi nhị phân mờ đục. 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 các cột BLOB
của bạn mà không cần mã hóa cơ sở đầu tiên. . Siêu dữ liệu nhiều hơn về điều này dưới đây].the whole point of BLOB
columns is that they store opaque binary strings. So just go ahead and store your stuff directly into your BLOB
columns without first Base64-encoding them. [That said, if MySQL has a more suitable type for the particular data being stored, you may wish to use that instead: for example, text files like JavaScript sources could benefit from being stored in TEXT
columns for which MySQL natively tracks text-specific
metadata—more on this below].
Ý 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 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 không có thông tin. Ý tưởng này dường như được đặt trong niềm tin sai lầm rằng, bởi vì SQL chỉ bao gồm văn bản có thể in trong các bối cảnh khác, nó chắc chắn cũng phải yêu cầu nó cho dữ liệu nhị phân [ít nhất là để truyền dữ liệu, nếu không lưu trữ dữ liệu]. Điều này chỉ đơ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 chuỗi chuỗi đơn giản [miễn là chúng được trích dẫn và thoát ra đúng như bất kỳ chuỗi nào khác]; Tất nhiên, cách ưa thích để truyền dữ liệu [thuộc bất kỳ loại nào] cho 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 loại dữ liệu của các tham số của bạn có thể dễ dàng trở thành chuỗi nhị phân thô như bất kỳ thứ gì khác.
... Trừ khi nó được lưu trữ vì lý do hiệu suất ...
Tình huống duy nhất trong đó 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 nó thường được truyền qua một giao thức yêu cầu mã hóa như vậy [ví dụ: bằng cách đính kèm email] ngay sau khi được lấy từ cơ sở dữ liệu trong trường hợp đó, lưu trữ cơ sở Biểu diễn sẽ lưu khỏi việc phải thực hiện hoạt động mã hóa trên dữ liệu thô khác trên 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 cơ sở64 chỉ đóng vai trò là bộ đệm, giống như người ta có thể lưu trữ dữ liệu bị biến dạng cho lý do hiệu suất.
... trong trường hợp đó sẽ không phải là ____ không BLOB
Như đã đề cập ở trên: Sự khác biệt duy nhất giữa các cột TEXT
và BLOB
là, đối với các cột TEXT
, MySQL cũng theo dõi siêu dữ liệu cụ thể của văn bản [như mã hóa ký tự và đối chiếu] cho bạn. Siêu dữ liệu bổ sung này cho phép MySQL chuyển đổi các 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 hoạt động so sánh/sắp xếp chuỗi ưa thích.
Nói chung: Nếu hai máy khách làm việc trong các bộ ký tự khác nhau sẽ thấy cùng một byte, thì bạn muốn một cột BLOB
; Nếu họ sẽ thấy các ký tự giống nhau thì bạn muốn một cột TEXT
.
Với Base64, hai máy khách đó cuối cùng phải thấy rằng dữ liệu giải mã thành cùng một byte; 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 cơ sở64 của BLOB
0 [đó là BLOB
1]. 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 BLOB
2 đến cơ sở dữ liệu.
Nếu chuỗi byte đó được lưu trữ trong cột
BLOB
và sau đó được truy xuất bởi một ứng dụng đang hoạt động trong UTF-16*, thì các byte tương tự sẽ được trả về, đại diện choBLOB
4 chứ không phải giá trị được mã hóa cơ sở64 mong muốn; nhưng trái lạiNếu chuỗi byte đó được lưu trữ trong cộ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ã trên FLE để trả về trình tự byte ____ 16 .
Tất nhiên, tuy nhiên, bạn có thể sử dụng các cột BLOB
và theo dõi mã hóa ký tự theo một 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 sự phức tạp bảo trì và nguy cơ đưa ra các lỗi không chủ ý.
* Trên thực tế, MySQL không hỗ trợ sử dụng các bộ ký tự máy khách không tương thích byte với ASCII [và do đó mã hóa Base64 sẽ luôn nhất quán trên bất kỳ sự kết hợp nào của chúng], nhưng ví dụ này vẫn phục vụ để minh họa cho sự khác biệt giữa các loại cột BLOB
và TEXT
và do đó giải thích lý do tại sao TEXT
về mặt kỹ thuật chính xác cho mục đích này mặc dù BLOB
sẽ thực sự hoạt động mà không có lỗi [ít nhất là cho đến khi MySQL thêm hỗ trợ cho các bộ ký tự máy khách không tương thích ASCII].