Просто прояснити. або підвести підсумки.
- nchar і nvarchar можуть зберігати символи Unicode.
- char і varcharне можуть зберігати символи Unicode.
- char і ncharфіксірованная довжина, яка буде зарезервувати простір для зберігання для кількості які ви вказуєте, навіть якщо ви не використовуєте весь цей простір.
- varchar і nvarcharпеременная довжина, які будуть використовувати тільки прогалини для збережених вами символів. Він не резервує сховище, наприклад char або nchar.
nchar і nvarchar будуть займати в два рази більше місця для зберігання, тому може бути розумним використовувати їх, тільки якщо вам потрібна підтримка Unicode.
відповідь дан Brian Kim 04 Жовтня. '17 о 18:50
char і varchar не призначені для зберігання юнікода, але з деякими додатковими трюками кодування і додаткової логікою ви все одно можете використовувати поле char [var] для зберігання unicode. - Wim ten Brink 04 Жовтня. '17 о 18:50
Це залежить від того, чи будуть версії n. займати в два рази більше місця для зберігання як показує моя відповідь - Martin Smith 04 Жовтня. '17 о 18:50
У чому перевага резервування сховища? - mlissner 04 Жовтня. '17 о 18:50
В останньому пункті: Використання Unicode nchar і nvarchar в більшості випадків все ж краще, покращуючи зіставлення, гнучкість для користувачів, усуває майбутні проблеми сумісності. І, до речі, простір для зберігання даних не є проблемою для цього випадку, оскільки використання сортування без Unicode - це багато клопоту, і в майбутньому кількість пам'яті буде продовжувати зменшуватися - Jaison Varghese 04 Жовтня. '17 о 18:50
Фактично, ні char / varchar, ні nchar / nvarchar не можуть зберігати весь діапазон символів Юнікоду, тому вводити в оману можна сказати, що можна зберігати символи Unicode, а інший - ні. Фіксована двухбайтовая кодування (SQL Server використовує таку систему кодування під назвою UCS-2 для nchar і nvarchar) недостатньо велика, щоб охопити повний діапазон Unicode. Див. Моя відповідь для більш докладної інформації. - PeterAllenWebb 04 Жовтня. '17 о 18:50
+1 якщо все це вірно - kta 04 Жовтня. '17 о 18:50
Однак для [n] varchar ви можете зберігати рядки фіксованої довжини, якщо хочете, наприклад varchar (20). У чому різниця між char (20) і varchar (20)? - Ben Caine 04 Жовтня. '17 о 18:50
@BenCaine char (20) буде використовувати 20 байтів (за умови 8-бітної сортування); varchar (20) буде використовувати len (data) +2 байта, тобто 22 для 20 байтів даних, але тільки 12 для 10 байтів даних. Додаткові два байта - це записи довжини. Якщо ваші дані завжди будуть повної довжини, використовуйте символ, оскільки він економить місце і може бути швидше. Будь ласка, ніколи не використовуйте varchar (1), або навіть що-небудь менше, ніж varchar (4). Один символ в форматі varchar використовує три байта, тому char (3) ніколи не буде використовувати більше місця, ніж varchar (3). - Richard Gadsden 04 Жовтня. '17 о 18:50
@RichardGadsden Чи не буде порожній рядок varchar (3) займати менше місця, ніж порожній рядок char (3)? 2 байта проти 3 байта? - andrewb 04 Жовтня. '17 о 18:50
@andrewb технічно, але у вас зазвичай є нуль, який взагалі не є байтом. - Richard Gadsden 04 Жовтня. '17 о 18:50
Єдиний інший випадок, який я хотів би зробити, це те, що при спробі перенести дані з програми (наприклад, asp.net web api) в SQL-сервер, і у вас є набір стовпців для char, він дозволить вам оновлювати або вставляти будь-які поточний тип в нього. Чи є це неправильним або все ще можна сказати, щоб передати рядок символу. Приклад є полем "StateAbbrv char (2)" на сервері і public string StateAbbrv в додатку. - Edward 04 Жовтня. '17 о 18:50
Моя спроба узагальнити і виправити існуючі відповіді:
По-перше, char і nchar завжди будуть використовувати фіксований обсяг простору пам'яті, навіть якщо рядок, яку потрібно зберегти, менше доступного простору, тоді як varchar і nvarchar використовуватимуть лише стільки ж сховища простір, необхідне для зберігання цього рядка (плюс два байта службових даних, імовірно для зберігання довжини рядка). Тому пам'ятайте, що "var" означає "змінна", як в змінному просторі.
Другий важливий момент для розуміння полягає в тому, що nchar і nvarchar зберігати рядки, використовуючи точно два байта на символ, тоді як char і varchar використовують кодування, яка визначається шляхом сортування кодова сторінка, яка буде зазвичай бути рівно по одному байту на символ (хоча є виключення, див. нижче). Використовуючи два байта на символ, можна зберігати дуже широкий діапазон символів, тому основна річ, яку слід пам'ятати тут, полягає в тому, що nchar і nvarchar мають набагато кращий вибір, якщо ви хочете підтримку інтернаціоналізації, яку ви, ймовірно, робите.
Тепер для деяких більш тонких точок.
По-перше, nchar і nvarchar стовпці завжди зберігають дані з використанням UCS-2. Це означає, що буде використовуватися рівно два байта на символ, а будь-який символ Юнікоду на базовій багатомовної площині (BMP) можна зберегти в поле nchar або nvarchar. Однак не може зберігатися символ any Unicode. Наприклад, згідно з Вікіпедії, кодові пункти для єгипетських ієрогліфів виходять за межі БМП. Таким чином, рядки Unicode можуть бути представлені в UTF-8 і інших справжніх кодуваннях Unicode, які не можуть бути збережені в поле SQL Server nchar або nvarchar. а рядки, написані в єгипетських ієрогліфах, будуть серед них. На щастя, ваші користувачі, ймовірно, не пишуть в цьому скрипті, але це потрібно пам'ятати!
відповідь дан PeterAllenWebb 04 Жовтня. '17 о 18:50
- char. символьні дані фіксованої довжини з максимальною довжиною 8000 символів.
- nchar. дані Unicode фіксованої довжини з максимальною довжиною 4000 символів.
- = Довжина 8 біт
- = Довжина в 16 біт
відповідь дан ss. 04 Жовтня. '17 о 18:50
nchar має фіксовану довжину і може містити символи Unicode. він використовує два байтових сховища для кожного символу.
varchar має змінну довжину і не може містити символи Unicode. він використовує одне байтовое сховище для кожного символу.
відповідь дан Manu 04 Жовтня. '17 о 18:50
Неправильно. Unicode може використовувати від 1 до 4 байтів (в загальному) для кожного символу. Крім того, varchar може містити unicode, але він не розпізнається як unicode. В результаті, varchar вважається ненадійним для зберігання unicode. (Тим більше, що існує ризик того, що код, який звертається до полю, переведе його неправильно). - Wim ten Brink 04 Жовтня. '17 о 18:50
@Alex: Я думаю, ви висловили свою точку зору, але я до сих пір не згоден з вами. Що ви говорите, так це те, що int CAN тримає довгий, якщо довгий розмір буде менше, ніж 2 ^ 32. Це не тільки "ненадійний", це невід'ємне обмеження, яке робить неможливим охоплення всього діапазону значень. - Manu 04 Жовтня. '17 о 18:50
NVARCHAR може зберігати символи Unicode і приймає 2 байта на символ.
відповідь дан Gustavo Rubio 04 Жовтня. '17 о 18:50
НЕПРАВИЛЬНО! Unicode використовує від 1 до 4 байтів на символ! Багато хто забуває про це! Навіть використання UTF-16 може привести до того, що деякі символи беруть 4 байта замість 2, хоча загальна довжина буде 2 байта. Деякі інші підформатів Unicode можуть займати більше 4 байтів! - Wim ten Brink 04 Жовтня. '17 о 18:50
@WimtenBrink - Питання про SQL Server і nvarchar завжди займає 2 байта на символ. - Martin Smith 04 Жовтня. '17 о 18:50
- Розмір сховища - n байтів.
- Синонім ISO для символу - символ.
Ми отримали h як висновок. Тому що ми не вказали довжину для char. Він буде займати за замовчуванням довжину 1.
- Строкові дані змінної довжини, а не Unicode.
- n визначає довжину рядка і може бути значенням від 1 до 8 000.
- max вказує, що максимальний розмір сховища становить 2 ^ 31-1 байта (2 ГБ).
- Розмір сховища - це фактична довжина введених даних + 2 байта.
- Синоніми ISO для varchar мають різний характер або характер.
- Строкові дані Unicode з фіксованою довжиною.
- n визначає довжину рядка і має бути значенням від 1 до 4000.
- Синоніми ISO для nchar - національний символ і національний характер.
nvarchar [(n | max)]
- Строкові дані Unicode змінної довжини.
- n визначає довжину рядка і може бути значенням від 1 до 4000.
- max вказує, що максимальний розмір сховища становить 2 ^ 31-1 байта (2 ГБ).
- Синоніми ISO для nvarchar мають національний характер і різний національний характер.
відповідь дан vikram reddy 04 Жовтня. '17 о 18:50