Hướng dẫn can i store base64 in mysql? - tôi có thể lưu trữ base64 trong mysql không?

Tôi cho rằng hình ảnh (tệp) thường không được lưu trữ trong cơ sở dữ liệu cơ sở dữ liệu64 được mã hóa. Thay vào đó, chúng được lưu trữ ở dạng nhị phân thô của chúng trong một cột nhị phân, cột blob hoặc tệp.

Base64 chỉ được sử dụng như một cơ chế vận chuyển, không phải để lưu trữ. Ví dụ: bạn có thể nhúng hình ảnh được mã hóa Base64 vào tài liệu XML hoặc thông báo email.

Base64 cũng thân thiện với Stream. Bạn có thể mã hóa và giải mã trên con ruồi (mà không biết tổng kích thước của dữ liệu).

Trong khi Base64 là tốt để vận chuyển, không lưu trữ hình ảnh của bạn Base64 được mã hóa.do not store your images base64 encoded.

Base64 không cung cấp tổng kiểm tra hoặc bất cứ thứ gì có giá trị để lưu trữ.

Base64 Mã hóa làm tăng yêu cầu lưu trữ lên 33% so với định dạng nhị phân thô. Nó cũng làm tăng lượng dữ liệu phải được đọc từ lưu trữ liên tục, thường là nút cổ chai lớn nhất trong điện toán. Nó thường nhanh hơn để đọc ít byte hơn và mã hóa chúng một cách nhanh chóng. Chỉ khi hệ thống của bạn bị ràng buộc CPU thay vì IO bị ràng buộc và bạn thường xuyên xuất ra hình ảnh trong Base64, thì hãy xem xét lưu trữ trong Base64.

Hình ảnh nội tuyến (hình ảnh được mã hóa Base64 được nhúng trong HTML) là một nút cổ chai-bạn đã gửi thêm 33% dữ liệu trên dây và thực hiện nó một cách tự do (trình duyệt web phải chờ trên hình ảnh nội tuyến trước khi nó có thể hoàn thành tải xuống trang Html).

Trên MySQL và có lẽ là cơ sở dữ liệu tương tự, vì lý do hiệu suất, bạn có thể muốn lưu trữ các hình ảnh rất nhỏ ở định dạng nhị phân trong các cột BINARY hoặc VARBINARY để chúng ở cùng một trang với khóa chính, trái ngược với các cột BLOB, luôn luôn Được lưu trữ trên một trang riêng biệt và đôi khi buộc sử dụng các bảng tạm thời.

Nếu bạn vẫn muốn lưu trữ hình ảnh Base64 được mã hóa, xin vui lòng, bất cứ điều gì bạn làm, hãy chắc chắn rằng bạn không lưu trữ dữ liệu được mã hóa Base64 trong cột UTF8 sau đó lập chỉ mục.

Trả lời một câu hỏi

Chúng tôi có bảng MySQL Innodb giữ ~ 10 cột của các tệp JavaScript nhỏ được mã hóa và PNG (

Có một vài phần chèn và rất nhiều lần đọc một cách tương đối, tuy nhiên đầu ra đang được lưu trữ trên một ví dụ được ghi nhớ trong vài phút để tránh các lần đọc tiếp theo.

Vì hiện tại, chúng tôi đang sử dụng BLOB cho các cột đó, nhưng tôi tự hỏi liệu có lợi thế trong việc chuyển sang kiểu dữ liệu TEXT về mặt hiệu suất hoặc chụp nhanh.

Việc đào tìm kiếm của tôi chỉ ra rằng BLOBTEXT cho trường hợp của tôi gần giống nhau và vì tôi không biết trước đây loại dữ liệu nào sẽ thực sự được lưu trữ nên tôi đã đi cho BLOB.

Bạn có bất kỳ gợi ý nào về cuộc tranh luận về văn bản vs blob cho trường hợp cụ thể này không?

Câu trả lời

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ẽ là TEXT không phải BLOB

Như đã đề cập ở trên: Sự khác biệt duy nhất giữa các cột TEXTBLOB 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ử người ta muốn chèn mã hóa cơ sở64 của VARBINARY8 (đó là VARBINARY9). 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 BLOB0 đế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 cho BLOB2 chứ không phải giá trị được mã hóa cơ sở mong muốn; nhưng trái lại

  • Nế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 fly để trả về trình tự byte ____ 24 .

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ì thêm 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 BLOBTEXT 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).

Chúng ta có thể lưu trữ Base64 trong Blob không?

Blobs được lưu trữ trong các tệp mô hình dữ liệu bảng tính phải được mã hóa bằng cách sử dụng mã hóa Base64 trước bất kỳ nén và lưu trữ nào khác. Để biết thông tin về định dạng tệp mô hình dữ liệu bảng tính, xem Phần 2.1.. For information about the Spreadsheet Data Model file format, see section 2.1.

Tại sao Base64 không an toàn?

Base64 không phải là một mã hóa, nó là một mã hóa.Vai trò của nó là đảm bảo mật khẩu có thể được lưu trữ trong cơ sở dữ liệu một cách độc đáo và các ký tự đặc biệt không phải là vấn đề.Nó không có gì để bảo vệ mật khẩu.Từ quan điểm bảo mật, nó hoàn toàn giống như lưu trữ nó mà không có bất kỳ mã hóa nào.. It's role is to make sure the password can be stored in the database nicely and special characters aren't a problem. It does nothing to protect the password. From security standpoint, it is exactly the same as storing it without any encoding.

Base64 có dễ bị nứt không?

Tóm lại, không.Ở bên ngoài, có vẻ như mã hóa Base64 có thể được sử dụng để mã hóa dữ liệu, tuy nhiên, Base64 mã hóa chỉ chuyển đổi dữ liệu thành một định dạng văn bản.Giải mã Base64 không sử dụng mật mã và không có sự ngẫu nhiên nào được sử dụng trong quá trình này.Do đó, bất kỳ dữ liệu được mã hóa Base64 nào cũng có thể được giải mã bởi người khác.any Base64 encoded data can be easily decoded by someone else.

Base64 có hiệu quả hơn Hex không?

Sự khác biệt giữa Base64 và Hex thực sự chỉ là cách thể hiện byte.Hex là một cách khác để nói "Base16".Hex sẽ lấy hai ký tự cho mỗi byte - base64 lấy 4 ký tự cho mỗi 3 byte, vì vậy nó hiệu quả hơn Hex.Base64 takes 4 characters for every 3 bytes, so it's more efficient than hex.