2012-10-31 14 views
12

cơ sở dữ liệu của tôi (MySql) có một đối chiếu utf8_general. Tôi đang truy cập dữ liệu từ cơ sở dữ liệu và hiển thị một trang web (được phát triển trong Perl), nó hiển thị các ký tự tiếng Thụy Điển (ä, å, ö) với các ký tự khác nhau. Tôi đã kiểm tra trong cơ sở dữ liệu Mysql, ở đó tôi có thể thấy dữ liệu với các ký tự ä, å, ö trong đó. Dường như, có sự cố mã hóa khi truy cập dữ liệu. Trong khi kết nối với cơ sở dữ liệu, được sử dụng theo mã sauutf8 mã hóa trong Perl và MySql

my($dbh) = DBI->connect($config{'dbDriver'},$config{'dbUser'},$config{'dbPass'}) or die "Kunde inte ansluta till $config{'dataSource'}: " . $DBI::errstr; 
$dbh->{'mysql_enable_utf8'} = 1; 
$dbh->do('set names utf8'); 

Bất kỳ trợ giúp nào đều được phân tích!

Cảm ơn.

+0

"có một số vấn đề khi truy cập dữ liệu đó" không phải là mô tả đầy đủ về sự cố. – ikegami

+0

Ý tôi là, có một số vấn đề về mã hóa khi truy cập dữ liệu. Tôi cũng đã cập nhật câu hỏi của mình. – dotnetrocks

+0

Làm thế nào chính xác là nó hiển thị các ký tự? Mã hóa trang web của bạn là gì? –

Trả lời

6

Nếu mỗi A/A/ö đang được đại diện trong đầu ra bởi hai byte, sau đó nó cũng có thể rằng bạn có thể kích đúp mã hóa các nhân vật. (Cho rằng câu hỏi đã cho thấy bạn đang thực hiện $dbh->{'mysql_enable_utf8'} = 1;, tôi nghi ngờ rằng đây là trường hợp có khả năng nhất.) Một khả năng khác, cho rằng bạn đang hiển thị điều này trên trang web, là trang có thể không chỉ định rằng bảng mã là UTF -8 trong số <head> và trình duyệt có thể đoán sai mã hóa ký tự mà nó sử dụng.

Hãy xem xét kỹ khung webapp, hệ thống tạo khuôn mẫu, v.v. để đảm bảo rằng các giá trị chỉ được mã hóa một lần khi chúng được truy xuất từ ​​cơ sở dữ liệu và khi chúng đến trình duyệt của người dùng. Nhiều công cụ khuôn mẫu/khuôn mẫu (như kết hợp Dancer và TT mà tôi thường sử dụng) sẽ xử lý mã hóa đầu ra tự động nếu bạn định cấu hình chính xác, có nghĩa là dữ liệu sẽ được mã hóa kép nếu được mã hóa rõ ràng trước khi xuất.

+1

Tôi đã mã hóa hai lần. Tôi đã gỡ bỏ nó và làm việc ngay bây giờ !! cảm ơn rất nhiều !! :) – dotnetrocks

0

Bạn cần đặt Charset thành utf8 trong kết nối của mình!

charset = utf8 
6

Bạn cần phải thiết lập mysql_enable_utf8 trên kết nối:

my($dbh) = DBI->connect(
    'dbi:mysql:test', 
    'user', 
    'password', 
    { 
     mysql_enable_utf8 => 1, 
    }  
); 
+0

hi, cảm ơn. Tôi đã thử mysql_enable_utf8 => 1 nhưng vấn đề không được giải quyết. – dotnetrocks

+0

@dotnetrocks: giải quyết được sự cố bạn đã nêu trong câu hỏi của mình. Nếu bạn gặp sự cố với mã hóa trên các trang web, bạn nên cẩn thận về IO và các tiêu đề thích hợp –

0

Dưới đây là spec complet:

http://search.cpan.org/~capttofu/DBD-mysql-4.038/lib/DBD/mysql.pm#mysql_enable_utf8

Thêm vào đó, bật cờ này cho MySQL rằng dữ liệu đến phải được coi là UTF-8. Điều này sẽ chỉ có hiệu lực nếu được sử dụng như một phần của cuộc gọi để kết nối(). Nếu bạn bật cờ sau khi kết nối, bạn sẽ cần phải ra lệnh SET NAMES utf8 để nhận được cùng một hiệu lực .