Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите с collate  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
На сервере 2008 R2 с collate по-умолчанию Cyrillic_General_CI_AS делаю select с последующим insert из тестового файла:
select *
FROM OPENROWSET( 
	BULK 'c:\source.csv',		
	FORMATFILE = 'c:\client.fmt',	
	FIRSTROW=2,		
	ERRORFILE = 'c:\client_error.txt',		
	MAXERRORS = 0	
) AS a;


Файл форматирования:
9.0
10
1       SQLCHAR             0       19      ";"      1     id_client                  ""
2       SQLCHAR             0       50      ";"      2     FirstName                  Cyrillic_General_CI_AS
3       SQLCHAR             0       50      ";"      3     LastName                   Cyrillic_General_CI_AS
4       SQLCHAR             0       50      ";"      4     FamilyName                 Cyrillic_General_CI_AS
5       SQLCHAR             0       50      ";"      5     PhoneMob                   Cyrillic_General_CI_AS
6       SQLCHAR             0       50      ";"      6     PhoneReg                   Cyrillic_General_CI_AS
7       SQLCHAR             0       50      ";"      7     PhoneGor                   Cyrillic_General_CI_AS
8       SQLCHAR             0       50      ";"      8     PhoneWork                  Cyrillic_General_CI_AS
9       SQLCHAR             0       100     ";"      9     City                       Cyrillic_General_CI_AS
10      SQLCHAR             0       12      ";\n"  	 10    Summa                      ""


Файл читается в правильной кодировке.

При выполнении того же кода на SQL 2005 с collate по умолчанию SQL_Latin1_General_CP1_CI_AS появляются "крякозябры". Подскажите, что необходимо поправить. Изменить collate сервера не предлагать.
12 дек 13, 10:51    [15280995]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
Glory
Member

Откуда:
Сообщений: 104751
virtuOS
Файл читается в правильной кодировке.

А "правильная" - это какая ?
12 дек 13, 10:56    [15281027]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
База, в которую вставляются данные, в Cyrillic_General_CI_AS. Изменить нельзя, т.к. клиентское приложение корректно работает только с такой кодировкой.
12 дек 13, 11:02    [15281084]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
Glory
Member

Откуда:
Сообщений: 104751
virtuOS
База, в которую вставляются данные, в Cyrillic_General_CI_AS.

Причем тут база ?
Файл в какой кодировке ?
Вы зря надеетесь, что сервер за вас будет перекодировать данные.
Он этого не умеет.
12 дек 13, 11:04    [15281100]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Кирилица UNIX ANSI, только завершающий символ строки один, а не два, как в windows cp1251.
12 дек 13, 11:30    [15281292]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
Glory
Member

Откуда:
Сообщений: 104751
virtuOS
Кирилица UNIX ANSI

Мда.
В Notepad-е на машине, где установлен mssql, вы эту киррилицу видите ?
12 дек 13, 11:39    [15281375]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Glory, файл во вложении.

К сообщению приложен файл (client.csv - 561bytes) cкачать
12 дек 13, 12:05    [15281584]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
Glory
Member

Откуда:
Сообщений: 104751
virtuOS
Glory, файл во вложении.

Файл содержит "крякозябры"
12 дек 13, 12:07    [15281599]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
может я что-то не понимаю... Какая у файла кодировка по вашему мнению?
12 дек 13, 12:21    [15281727]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
Glory
Member

Откуда:
Сообщений: 104751
virtuOS
Какая у файла кодировка по вашему мнению?

encoding -ANSI
А в какой codepage был _создан_ этот файл - фиг его знает, такой информации файл не содержит
12 дек 13, 12:24    [15281744]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
o-o
Guest
простите, я "мимо пробегая", т.е. вываливаю проделанное + решение, не анализируя,
пусть объяснит кто другой или может вечером додумаю.

имею сервер с латинским коллэйшеном, но иду спецом в базу с кириллическим.
если ничего не прописывать, а молча создавать в ней таблицы, коллэйшн наследуется кириллический.
беру скрипт ТС-а, выполняю.
таблица заполнилась кракозябрами.
НО: мой Ворд отлично открывает сам файл в виндовой кодировке 1251, демонстрируя кириллицу.
думаю, мало-ли, файл форматирования кривой.
заставляю BCP сгенерить новый формат-файл.
ага, он мне сгенерил с ЛАТИНСКИМ коллэйшеном!
иду саму таблицу смотреть.
и там все колонки с латинским коллэйшеном.
тогда беру в сгенеренном скрипте создания самой таблицы ЗАМЕНЯЮ коллэйшн на КИРИЛЛИЧЕСКИЙ
и пересоздаю таблицу:

drop table dbo.client;

CREATE TABLE [dbo].[client](
	[id_client] [varchar](19) COLLATE Cyrillic_General_CI_AS NULL,
	[FirstName] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[LastName] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[FamilyName] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[PhoneMob] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[PhoneReg] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[PhoneGor] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[PhoneWork] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[City] [varchar](100) COLLATE Cyrillic_General_CI_AS NULL,
	[Summa] [varchar](12) COLLATE Cyrillic_General_CI_AS NULL
) ON [PRIMARY]

GO


СНОВА ЗАПУСКАЮ СКРИПТ ТС-а, и вуаля, в таблице лежит кириллица.

впечатление такое, что плевал он на указанную в формат-файле кириллицу.
поэтому ее надо прописать во всех колонках таблицы.
а файл нормальный и кириллица там лежит обычная win 1251

К сообщению приложен файл. Размер - 18Kb
12 дек 13, 18:21    [15284312]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
В моем случае колонки в таблице уже в кирилице. У меня такое впечатление (простите, если это глупость), что импоррт через bulk запускается в контексте базы master вместо контекста клиентской базы, отсюда и латиница. Ведь на другом сервере с кирилицей по-умолчанию полный порядок.

Могу перед импортом в базу перекодировать файл в cp866 (dos/oem) или юникод. Но в таком случае не понимаю, какой коллейшен в файле форматирования надо прописать.
12 дек 13, 19:39    [15284602]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
user89
Member

Откуда:
Сообщений: 2083
virtuOS,

???
Bulk Insert параметр CODEPAGE
12 дек 13, 19:54    [15284657]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
для o-o

Похоже, что SSMS неверно показывает кодовую страницу в property's. При беглом тестировании импорт во вновь созданную таблицу с явным указанием collate проходит "на ура".

user89
автор
Примечание
Корпорация Майкрософт рекомендует указывать имя параметров сортировки для каждого столбца в файле форматирования.
12 дек 13, 20:25    [15284756]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
user89
Member

Откуда:
Сообщений: 2083
virtuOS,

таки через CodePage
if object_id ('tempdb..#tmp') is not null drop table #tmp
create table #tmp (idx varchar(500), LastName varchar(500), FirstName varchar(500), sName varchar(500), mob varchar(500), tel1 varchar(500), tel2 varchar(500), tel3 varchar(500),
nas varchar(500), credit varchar(500))

BULK INSERT #tmp
FROM 'd:\client.csv'
WITH (
  CODEPAGE = 'ACP',
  FIELDTERMINATOR =';',
  ROWTERMINATOR =';\n'
);

select * from #tmp

if object_id ('tempdb..#tmp') is not null drop table #tmp


К сообщению приложен файл. Размер - 5Kb
12 дек 13, 20:26    [15284757]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
o-o
Guest
user89,

нЭт, не канает.
Вам повезло с кириллическим коллэйшеном,
а у меня латинский, вот что выдает Ваш скрипт,
еще и строки все в одну слепил без format file:

К сообщению приложен файл. Размер - 19Kb
12 дек 13, 22:03    [15285076]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
user89
Member

Откуда:
Сообщений: 2083
o-o,

ради интереса сейчас сделал 2 тестовые базы с Latin1_General_100_CI_AS и Latin1_General_CI_AS_KS_WS
Кракозябры не выдал, выдал знаки вопроса. Вместо varchar сделал Nvarchar. Кириллица появилась.
12 дек 13, 22:26    [15285158]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
o-o
Guest
ну и кодом, соответственно:
use tempdb;

SELECT name, collation_name
FROM sys.columns
WHERE  OBJECT_NAME(object_id) like '#tmp%'
-------------------------------------------------
idx	Latin1_General_CI_AS
LastName	Latin1_General_CI_AS
FirstName	Latin1_General_CI_AS
sName	Latin1_General_CI_AS
mob	Latin1_General_CI_AS
tel1	Latin1_General_CI_AS
tel2	Latin1_General_CI_AS
tel3	Latin1_General_CI_AS
nas	Latin1_General_CI_AS
credit	Latin1_General_CI_AS


virtuOS, у меня студия все правильно показывает.
профайлером ловится, что при двойном щелчке на столбце в эксплорере она засылает такое:
+


exec sp_executesql N'SELECT
''Server[@Name='' + quotename(CAST(
        serverproperty(N''Servername'')
       AS sysname),'''''''') + '']'' + ''/Database[@Name='' + quotename(db_name(),'''''''') + '']'' + ''/Table[@Name='' + quotename(tbl.name,'''''''') + '' and @Schema='' + quotename(SCHEMA_NAME(tbl.schema_id),'''''''') + '']'' + ''/Column[@Name='' + quotename(clmns.name,'''''''') + '']'' AS [Urn],
clmns.name AS [Name],
clmns.column_id AS [ID],
clmns.is_nullable AS [Nullable],
clmns.is_computed AS [Computed],
CAST(ISNULL(cik.index_column_id, 0) AS bit) AS [InPrimaryKey],
clmns.is_ansi_padded AS [AnsiPaddingStatus],
CAST(clmns.is_rowguidcol AS bit) AS [RowGuidCol],
ISNULL(ic.is_not_for_replication, 0) AS [NotForReplication],
CAST(COLUMNPROPERTY(clmns.object_id, clmns.name, N''IsFulltextIndexed'') AS bit) AS [IsFullTextIndexed],
CAST(ISNULL(COLUMNPROPERTY(clmns.object_id, clmns.name, N''IsDeterministic''),0) AS bit) AS [IsDeterministic],
CAST(ISNULL(COLUMNPROPERTY(clmns.object_id, clmns.name, N''IsPrecise''),0) AS bit) AS [IsPrecise],
ISNULL(cc.definition,N'''') AS [ComputedText],
CAST(ISNULL(cc.is_persisted, 0) AS bit) AS [IsPersisted],
ISNULL(clmns.collation_name, N'''') AS [Collation],
CAST(ISNULL((select TOP 1 1 from sys.foreign_key_columns AS colfk where colfk.parent_column_id = clmns.column_id and colfk.parent_object_id = clmns.object_id), 0) AS bit) AS [IsForeignKey],
clmns.is_identity AS [Identity],
CAST(ISNULL(ic.seed_value,0) AS bigint) AS [IdentitySeed],
CAST(ISNULL(ic.increment_value,0) AS bigint) AS [IdentityIncrement],
(case when clmns.default_object_id = 0 then N'''' when d.parent_object_id > 0 then N'''' else d.name end) AS [Default],
(case when clmns.default_object_id = 0 then N'''' when d.parent_object_id > 0 then N'''' else schema_name(d.schema_id) end) AS [DefaultSchema],
(case when clmns.rule_object_id = 0 then N'''' else r.name end) AS [Rule],
(case when clmns.rule_object_id = 0 then N'''' else schema_name(r.schema_id) end) AS [RuleSchema],
CAST(clmns.is_filestream AS bit) AS [IsFileStream],
CAST(clmns.is_sparse AS bit) AS [IsSparse],
CAST(clmns.is_column_set AS bit) AS [IsColumnSet],
usrt.name AS [DataType],
sclmns.name AS [DataTypeSchema],
ISNULL(baset.name, N'''') AS [SystemType],
CAST(CASE WHEN baset.name IN (N''nchar'', N''nvarchar'') AND clmns.max_length <> -1 THEN clmns.max_length/2 ELSE clmns.max_length END AS int) AS [Length],
CAST(clmns.precision AS int) AS [NumericPrecision],
CAST(clmns.scale AS int) AS [NumericScale],
ISNULL(xscclmns.name, N'''') AS [XmlSchemaNamespace],
ISNULL(s2clmns.name, N'''') AS [XmlSchemaNamespaceSchema],
ISNULL( (case clmns.is_xml_document when 1 then 2 else 1 end), 0) AS [XmlDocumentConstraint],
CASE WHEN usrt.is_table_type = 1 THEN N''structured'' ELSE N'''' END AS [UserType]
FROM
sys.tables AS tbl
INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tbl.object_id
LEFT OUTER JOIN sys.indexes AS ik ON ik.object_id = clmns.object_id and 1=ik.is_primary_key
LEFT OUTER JOIN sys.index_columns AS cik ON cik.index_id = ik.index_id and cik.column_id = clmns.column_id and cik.object_id = clmns.object_id and 0 = cik.is_included_column
LEFT OUTER JOIN sys.identity_columns AS ic ON ic.object_id = clmns.object_id and ic.column_id = clmns.column_id
LEFT OUTER JOIN sys.computed_columns AS cc ON cc.object_id = clmns.object_id and cc.column_id = clmns.column_id
LEFT OUTER JOIN sys.objects AS d ON d.object_id = clmns.default_object_id
LEFT OUTER JOIN sys.objects AS r ON r.object_id = clmns.rule_object_id
LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = clmns.user_type_id
LEFT OUTER JOIN sys.schemas AS sclmns ON sclmns.schema_id = usrt.schema_id
LEFT OUTER JOIN sys.types AS baset ON (baset.user_type_id = clmns.system_type_id and baset.user_type_id = baset.system_type_id) or ((baset.system_type_id = clmns.system_type_id) and (baset.user_type_id = clmns.user_type_id) and (baset.is_user_defined = 0) and (baset.is_assembly_type = 1)) 
LEFT OUTER JOIN sys.xml_schema_collections AS xscclmns ON xscclmns.xml_collection_id = clmns.xml_collection_id
LEFT OUTER JOIN sys.schemas AS s2clmns ON s2clmns.schema_id = xscclmns.schema_id
WHERE
(clmns.name=@_msparam_0)and((tbl.name=@_msparam_1 and SCHEMA_NAME(tbl.schema_id)=@_msparam_2))',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000)',@_msparam_0=N'FirstName',@_msparam_1=N'client',@_msparam_2=N'dbo'


посмотрите, что Ваша засылает.
12 дек 13, 22:28    [15285171]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
o-o
Guest
не, ну издевательство да и только.
думаю, заставлю bcp сгенерить формат-файл для правильной кириллической таблицы.
генерит без указания коллэйшена.

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

можно было бы подумать, что оно вообще коллэйшены не вписывает,
но ведь латинский вписывало!!!
короче, вывод: про кириллицу оно не знает или нагло игнорирует.
сейчас нагенерю столбцов всех известных коллэйшенов и заставлю bcp на это выдать формат-файл.
и узнаем, какие оно "любит", а какие нет
12 дек 13, 22:46    [15285235]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
o-o
Guest
user89
o-o,
ради интереса сейчас сделал 2 тестовые базы с Latin1_General_100_CI_AS и Latin1_General_CI_AS_KS_WS
Кракозябры не выдал, выдал знаки вопроса. Вместо varchar сделал Nvarchar. Кириллица появилась.

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

с вопросиками надо обдумать. у меня варианты только кракозябры-кириллица, никаких вопросиков.
у нас в чем отличия? у меня темпдб и мастер латинские, у вас кириллические.
+ у моей винды страница 1252, хотя попытка запустить импорт скриптом из sqlcmd
с предварительной сменой chcp 1251 успехом не увенчалась.
может кто-то еще догадается, в чем тут дело, и нам напишет :)
12 дек 13, 23:08    [15285293]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
o-o
Guest
ну я и туплю
все bcp сгенерил нормально, коллэйшн тоже,
просто я FAR-ом смотрю в режиме EDIT, и строка не влезла
не вижу особых отличий, кроме версии в первой строке (10.0),
но и смена версии в файле ТС-а ничего не поменяла
13 дек 13, 00:06    [15285448]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
o-o
Guest
последняя на сегодня идея.
меняю в файле форматирования коллэйшн для двух столбцов: FirstName, LastName
на греческий.
вставляю в заранее заготовленную таблицу со всеми полями nvarchar.
ну что, все он отлично понял, рез-т на картинке.

вывод: формат-файл верный, все в нем записанное учитывается,
но кириллицу надо класть либо в юникодные столбцы,
либо в кириллические.
потому что select into НЕ прописывает нужный коллэйшн в создаваемую таблицу.
и даже не используется коллэйшн базы.
поди коллейшн мастера рулит, как ТС и предположил

К сообщению приложен файл. Размер - 10Kb
13 дек 13, 02:29    [15285677]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Ерунда какая то. Сегодня вновь на той же базе крякозябры:
Картинка с другого сайта.

К сообщению приложен файл. Размер - 47Kb
13 дек 13, 09:39    [15286262]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
o-o
Guest
virtuOS,

выкладывайте загружаемый файл,
может там сегодня что-то перекодированное лежит.
а я сейчас проверю, коллэйшн мастера тут при чем-то или нет.
в моем зоопарке с утра появился новый экземпляр с греческим коллейшном.
сейчас я все в него позагружаю.
13 дек 13, 11:55    [15287276]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с collate  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
В том и прикол, что ничего не менялось.

use test;

INSERT INTO [dbo].[client_new]
           ([id_client]
           ,[FirstName]
           ,[LastName]
           ,[FamilyName]
           ,[PhoneMob]
           ,[PhoneReg]
           ,[PhoneGor]
           ,[PhoneWork]
           ,[City]
           ,summa)

SELECT [id_client]
           ,[FirstName]
           ,[LastName]
           ,[FamilyName]
           ,[PhoneMob]
           ,[PhoneReg]
           ,[PhoneGor]
           ,[PhoneWork]
           ,[City]
           ,summa

FROM OPENROWSET( 
	BULK 'c:\source.csv',		
	FORMATFILE = 'c:\client.fmt',	
	FIRSTROW=2,	
	MAXERRORS = 0
) AS a;


К сообщению приложен файл (2.ZIP - 761bytes) cкачать
13 дек 13, 13:52    [15288232]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить