2012-02-15 34 views
6

Tôi cần lưu trữ các ký tự đặc biệt và ký hiệu vào cơ sở dữ liệu mysql. Vì vậy, hoặc là tôi có thể lưu trữ nó vì nó giống như 'ü' hoặc chuyển đổi nó thành mã html như '& uuml;'Tôi có cần sử dụng các thực thể HTML khi lưu trữ dữ liệu trong cơ sở dữ liệu không?

Tôi không chắc chắn điều nào sẽ tốt hơn.

Ngoài ra tôi có các biểu tượng như '♥', '„'.

Vui lòng đề xuất cái nào tốt hơn? Cũng đề nghị nếu có bất kỳ phương pháp thay thế.

Cảm ơn.

+0

Tôi mất tự do thay đổi tiêu đề của bạn một chút - tiêu đề của bạn tốt, nhưng theo cách này, bạn sẽ dễ dàng tìm thấy các câu hỏi tương tự trong tương lai. (Tôi chỉ tìm kiếm và nhận ra không có bản sao dễ tìm này.) –

+1

Điều đó tùy thuộc vào bộ ký tự mà cột đang sử dụng nơi bạn lưu trữ HTML. Thông thường, bạn nên sử dụng bộ ký tự bao gồm tất cả các ký tự (vì vậy không có ký tự nào "đặc biệt") và dữ liệu của bạn có thể được lưu trữ ở dạng bình thường và không chứa bất kỳ mã hóa đặc biệt nào bên cạnh mã hóa mã vạch trống mà mọi trường văn bản trong cơ sở dữ liệu dù sao. – hakre

+0

@Pekka Tốt thôi. Nếu nó hữu ích cho người khác theo cách này, tôi phải cảm ơn bạn. –

Trả lời

5

Thực thể HTML đã được giới thiệu cách đây nhiều năm để vận chuyển thông tin ký tự trên dây khi vận chuyển không an toàn nhị phân và trong trường hợp tác nhân người dùng (trình duyệt) không hỗ trợ mã hóa ký tự của tầng vận chuyển hoặc máy chủ.

Là một thực thể HTML chỉ chứa các ký tự rất cơ bản (&, ;, a-z0-9) và những nhân vật có mã hóa nhị phân tương tự trong hầu hết các bộ ký tự, đây là và rất an toàn từ những tác dụng phụ.

Tuy nhiên khi bạn lưu trữ thứ gì đó trong cơ sở dữ liệu, bạn không có những vấn đề này vì bạn thường kiểm soát và bạn biết cách lưu trữ văn bản vào cơ sở dữ liệu.

Ví dụ: nếu bạn cho phép Unicode cho văn bản bên trong cơ sở dữ liệu, bạn có thể lưu trữ tất cả các ký tự, không có ký tự nào thực sự đặc biệt. Lưu ý rằng bạn cần phải biết cơ sở dữ liệu của mình ở đây, có một số chi tiết kỹ thuật mà bạn có thể chạy vào. Giống như bạn không biết mã hóa bảng mã cho kết nối cơ sở dữ liệu của bạn, do đó bạn không thể cho biết chính xác cơ sở dữ liệu của mình là văn bản nào bạn muốn lưu trữ trong đó. Nhưng nói chung, bạn chỉ cần lưu trữ văn bản và truy xuất lại sau. Không có gì đặc biệt để giải quyết.

Trong thực tế có nhược điểm khi bạn sử dụng các thực thể HTML thay vì nhân vật đồng bằng:

  • thực thể HTML tiêu thụ thêm không gian: ü là lớn hơn nhiều so ü trong LATIN-1, UTF-8, UTF-16 hoặc UTF-32.
  • Thực thể HTML cần được xử lý thêm. Chúng cần được tạo ra và khi đọc, chúng cần được phân tích cú pháp. Hãy tưởng tượng bạn cần phải tìm kiếm một văn bản cụ thể trong cơ sở dữ liệu của bạn, hoặc bất kỳ hành động nào khác sẽ cần xử lý thêm. Đó chỉ là trên không.

Điều thú vị thực sự bắt đầu khi bạn kết hợp cả hai khái niệm. Bạn đến một nơi bạn thực sự không muốn đi vào. Vì vậy, chỉ cần không làm điều đó bởi vì bạn sẽ không cần nó.

+0

Đây là 5 tuổi nhưng tôi muốn làm chứng cho "niềm vui thực sự" được đề cập trong đoạn cuối. Chúng tôi có một cơ sở dữ liệu MySql có rất nhiều bảng có các trường có trường 'latin1' AND với các đối chiếu 'utf-8'. Chúng tôi đã lưu trữ cả hai ký tự đặc biệt (chủ yếu là đăng ký và thương hiệu) và các thực thể html (và trong một số trường hợp các thực thể html được mã hóa kép, tức là '& reg;') trong cơ sở dữ liệu. Con trai và con gái, đừng đi xuống con đường này. Đưa ra quyết định thông minh khi nói về cách lưu trữ các ký tự trong cơ sở dữ liệu của bạn và gắn bó với nó. Khi bạn kéo dữ liệu ra, THEN bạn có thể sửa đổi nó tuy nhiên bạn cần. – DerProgrammer

5

Để nguyên dữ liệu của bạn trong cơ sở dữ liệu. Không sử dụng các thực thể HTML cho chúng cho đến khi bạn cần chúng cho HTML. Bạn không bao giờ biết khi nào bạn có thể muốn sử dụng dữ liệu của bạn ở nơi khác, không phải trên một trang web.

+1

+1, nhưng 'htmlentities' thậm chí không cần thiết khi xuất HTML - một' htmlspecialchars() 'sẽ làm để ngăn chặn XSS. 'htmlentities' nên * không bao giờ * cần thiết trong môi trường được định cấu hình đúng cách –

+1

@Pekka, tôi đã không đề xuất sử dụng hàm, tôi đã đề cập đến các thực thể. Có, 'htmlspecialchars()' là phương thức ưa thích để thực sự xuất dữ liệu. – Brad

1

Đề xuất của tôi sẽ phản ánh những người đóng góp khác, không chuyển đổi các thực thể đặc biệt khi lưu chúng vào cơ sở dữ liệu của bạn.

Một số lý do cấm cải đạo:

  • K.I.S.S principle (lý do lớn nhất của tôi không phải để làm điều đó)
  • nhất tổ chức sẽ kết thúc tốn nhiều không gian hơn sau đó trước khi được chuyển đổi
  • mất khả năng tìm kiếm các thực thể ü trong một từ, sẽ là [word]+ü+[/word] và bạn sẽ phải thực hiện so sánh chuỗi số html tương đương với ü =>[word]+ü+[/word].
  • lưu lượng của bạn có thể thay đổi từ HTML để nói API cho thiết bị di động, v.v. khiến việc chuyển đổi rất không cần thiết.
  • cần phải chuyển đổi trên dữ liệu đầu vào và trên đầu ra (một lần nữa nếu đầu ra của bạn thay đổi từ HTML thuần túy thành một thứ khác).
Các vấn đề liên quan