0

[ЭТО НЕ ВОПРОС О NVARCHAR ИЛИ КАК ХРАНИТЬ Китайский иероглиф]SQL набор символов сервера и N префикс

SQL Server 2008 Express

Database сверка является SQL_Latin1_General_CP1_CI_AS

create table sample1(val varchar(2)) 
insert into sample1 values(N'中文') 
  1. Я знаю, что эти китайские иероглифы станут мусорными символами.
  2. Я знаю, что могу использовать nvarchar для преодоления всех проблем.

Что я не знаю: почему нет ошибки «слишком длинной строки» при запуске инструкции insert?

  1. Префикс N означает, что клиент будет кодировать строку, используя UNICODE.
  2. 2 китайских символа станут 4 байтами.
  3. varchar (2) может содержать только 2 байта.

Почему люди голосуют за этот вопрос? действительно?

+7

Ну, SQL Server видит, что вы вставляете в столбец 'varchar', и поэтому он автоматически преобразует эту строку, которую вы передали, в строку, не совместимую с unicode, varchar, состоящую из двух символов , Два символа не слишком велики для хранения этого столбца .... –

+0

Первое, что varchar не может хранить такие символы напрямую, он преобразует их, поэтому обычно мы используем nvarchar. вы можете попробовать создать таблицу sample3 (val nvarchar (2)) Вставить в значения sample3 (N '中文') –

+0

Я знаю, что это не вопрос сохранения китайского. Как я уже говорил, подразумевается актерский состав и хранит его в вашем varchar как "??" (по крайней мере, на моей кодовой странице) – Paul

ответ

1

Подробнее объяснение @marc_s.

Символ N'中文' будет преобразован в varchar со сверткой SQL_Latin1_General_CP1_CI_AS. Поскольку на кодовой странице нет такого символа, он будет преобразован в не определенный, и 0x3f3f в конце. 0x3f - знак вопроса, поэтому в этом случае будет два знака вопроса, и он не будет превышать длину столбца.

0

Попробуйте использовать NVARCHAR (...), NCHAR (...) типов данных -

CREATE TABLE dbo.sample1 
(
    val NVARCHAR(4) 
) 
INSERT INTO dbo.sample1 
SELECT N'中文' 
2

Подразумеваемый бросок происходит. Это будет работать, если «val» был создан как nvarchar (2).

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