2012-05-01 2 views
0

Я перешел с SQL Server 2005 на mysql, что не было проблемой.mysql fluent nhibernate issue nvarchar

У меня есть небольшая проблема с (n) varchar, которые существуют в sql-сервере. Обычно я использовал:

mapping.Map(x => x.bla).Length(10000); 

установить bla на nvarchar (max). это работает в mysql? Я считаю, что нет NVARCHAR в MySQL, и вы должны использовать что-то вроде этого:

alter table sometable modify bla VARCHAR(21844) CHARACTER SET utf8 

обновить существующий столбец «NVARCHAR (макс)». Является ли это правильно, потому что я получаю:

«Размер строки слишком велик Максимальный размер строки для используемой таблицы типа»

Если я использую:

alter table sometable modify bla VARCHAR(1000) CHARACTER SET utf8 

вещи работать, но я не являюсь уверен, что это достигает «nvarchar (max)» в mysql.

ответ

2

Как объяснены в the manual:

Каждую таблица (независимо от механизма хранения) имеет максимальный размер строки 65535 байт. Двигатели хранения могут устанавливать дополнительные ограничения на этот предел, уменьшая эффективный максимальный размер строки.

Максимальный размер строки ограничивает число (и, возможно, размер) столбцов, поскольку общая длина всех столбцов не может превышать этот размер. Например, для символов utf8 требуется до трех байтов на символ, поэтому для столбца CHAR(255) CHARACTER SET utf8 сервер должен выделять 255 × 3 = 765 байтов на каждое значение. Следовательно, таблица не может содержать более 65535/765 = 85 таких столбцов.

Хранение столбцов переменной длины включает байты длины, которые оцениваются по размеру строки. Например, столбец VARCHAR(255) CHARACTER SET utf8 занимает два байта для хранения длины значения, поэтому каждое значение может занимать до 767 байт.

Поэтому вы должны рассмотреть, какие еще столбцы существуют в вашей таблице, и рассчитать максимальный размер, доступный для этого VARCHAR.

Однако, если вам требуется место для длинных текстовых значений, почему бы не использовать типы данных TEXT, которые не ограничены этим пределом (за исключением от 9 до 12 байт, которые они вносят в него)?

+0

Спасибо, имеет смысл. Извините за то, что вы так невежественны. MySQL. Хотя немного странно. Представьте себе, что я хотел бы добавить столбец в будущем (а не необоснованную ситуацию), и я уже превысил 65535 байт. Это означало бы, что я должен потенциально потерять данные ... – cs0815

+0

Просто увидел бит текста TEXT извините. Подумайте, как сказать nhibernate, чтобы использовать это. Возможно ли обновить существующий varchar до текста? Благодарю. – cs0815

+0

@csetzkorn: Да, просто 'ALTER TABLE sometable MODIFY bla TEXT;' – eggyal

Смежные вопросы