2012-10-19 19 views
6

thể trùng lặp:
How should I store GUID in MySQL tables?cột gì về MySQL sẽ trở lại như System.Guid trong C#


VARCHAR sẽ trở lại như string
BLOB sẽ trở lại dưới dạng byte[]
nhưng, loại cột nào của MySQL sẽ trả lại là System.Guid trong C#
cảm ơn.

được sửa đổi: Tôi đã tìm thấy câu trả lời

nhờ DaveHogan đó mang lại cho tôi những đầu mối về ORM (Relation Mapping Object)
tôi bắt đầu tìm kiếm thông tin về việc chuyển đổi kiểu dữ liệu (bản đồ) do Connector/NET . Tôi đang sử dụng Trình kết nối DotNet MySQL (Trình kết nối/NET)
có 3 tình huống khác nhau mà Trình kết nối/NET thực hiện.

Dưới đây là những gì tôi đã tìm thấy:

Tình hình 1:
Bắt đầu từ Connnector/NET 6.1.1, CHAR (36) sẽ được tự động chuyển đổi như System.GUID trong C# và Binary (16) sẽ được coi là System.Byte [].

2nd Tình hình:
Nếu bạn sử dụng cũ Connector/NET, Binary (16) sẽ được tự động chuyển đổi như System.GUID khi giá trị được truyền vào C# và CHAR (36) sẽ được xử lý như System.String.

3rd trạng:
Nếu bạn sử dụng phiên bản mới hơn Connector/NET (mới hơn 6.1.1), và nếu bạn muốn sử dụng Binary (16) AS System.GUID (được mặc định nó không phải là), bạn phải thêm tùy chọn kết nối Old Guids = true trong Chuỗi kết nối.
Ví dụ:

server=localhost;user=root;password=qwerty;database=test;old guids=true;

của thành viên này, CHAR (36) sẽ được chuyển đổi như System.String và Binary (16) = System.GUID

Đọc thêm về các lựa chọn kết nối của Cũ Hướng dẫn tại:
MySQL 5.6 Reference Manual: 21.2.6. Connector/Net Connection String Options Reference

---------------------------------------- ------------------------------
Thông tin bổ sung:
Cách chèn hệ thống.GUID vào Cơ sở dữ liệu MySql
------------------------------------------- ---------------------------
Đây là bảng mẫu, chúng tôi sẽ chèn System.GUID:

CREATE TABLE `testdata` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `binary` binary(16) DEFAULT NULL, 
    `char` char(36) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 

Chèn System.GUID vào MySQL

string constr = "server=localhost;user=root;pwd=qwerty;database=test;"; 
using (MySqlConnection conn = new MySqlConnection(constr)) 
{ 
    conn.Open(); 

    // Create a System.GUID 
    byte[] ba = new byte[16]; 
    Random rd = new Random(); 
    rd.NextBytes(ba); 
    System.Guid guid = new Guid(ba); 

    // Prepare GUID values in SQL format 
    string guidForChar36 = guid.ToString(); 
    string hexstring = BitConverter.ToString(guid.ToByteArray()); 
    string guidForBinary16 = "0x" + hexstring.Replace("-", string.Empty); 

    string sql = "insert into testdata(`binary`,`char`)" 
       + "values(" + guidForBinary16 + "," 
       + "'" + guidForChar36 + "');"; 

    MySqlCommand cmd = new MySqlCommand(sql, conn); 
    cmd.ExecuteNonQuery(); 

    conn.Close(); 
}
+0

Đây là định danh duy nhất trong MSSQL. Có lẽ nó tương tự trong MySQL – Ondra

Trả lời

2

EDIT:

Xin lỗi tôi hiểu lầm câu hỏi của bạn. Bạn nên sử dụng

BINARY(16) 

Làm thế nào bạn cast rằng đến một System.Guid phụ thuộc vào việc bạn đang sử dụng một ORM, vv

+0

em ... xin lỗi. bạn có thể giải thích ORM là gì không? – mjb

+0

http://en.wikipedia.org/wiki/Object-relational_mapping –

+0

không, tôi đang sử dụng MySql Dot Net Connector. MySql.Data.DLL – mjb

0

Bạn có thể sử dụng một guid như một CHAR(16) nhị phân nếu bạn muốn tận dụng tối đa sử dụng tối ưu không gian lưu trữ. hoặc sử dụng char(36)

+5

không. không sử dụng char cho dữ liệu nhị phân. Các trường char/varchar/text phải tuân thủ các quy tắc dịch mã charset và có thể dễ dàng mang dữ liệu nhị phân. luôn sử dụng kiểu nhị phân/varbinary/blob cho dữ liệu nhị phân. –

+1

Xin chào, Ravindra, tôi đã phát hiện ra rằng Bắt đầu từ Trình kết nối/NET 6.1.1, CHAR (36) sẽ được trả về dưới dạng System.GUID theo mặc định. và phiên bản Connector/NET cũ hơn 6.1.1, BINARY (16) sẽ được trả về như System.GUID. Tôi đã thêm các phát hiện của mình (kết luận) và được cập nhật trong câu hỏi của mình. Cảm ơn sự giúp đỡ của bạn anyway. – mjb

Các vấn đề liên quan