1112 Спасибо за отличные ответы, ребята. Вы дали мне много размышлений и помогли мне сформировать мое собственное мнение / стратегию, которая сводится к следующему:
Разрешить пустые значения if-and-only-if, если нулевое значение в этом столбце будет иметь конкретное значение для вашего приложения.
Пара общих значений для нуля:
В общем, если вы не можете придумать полезного значения для нуля в столбце, это должно быть NOT NULL
. Вы всегда можете изменить его на nullable позже.
Пример такого рода вещей, которыми я закончил:
create table SalesOrderLine (
Id int identity primary key,
-- a line must have exactly one header:
IdHeader int not null foreign key references SalesOrderHeader,
LineNumber int not null, -- a line must have a line number
IdItem int not null, -- cannot have null item
Quantity decimal not null, -- maybe could sell 0, but not null
UnitPrice decimal not null, -- price can be 0, but not null
-- a null delivery address means not for delivery:
IdDeliveryAddress int foreign key references Address,
Comment varchar(100), -- null means user skipped it
Cancelled bit not null default (0) -- true boolean, not three-state!
Delivered datetime, -- null means not yet delivered
Logged datetime not null default (GetDate()) -- must be filled out
)
Примечание: как сообщается в комментариях, приведенный ниже подход не работает JDK 9+. Используйте подход, описанный в ответе Джеймса Х.
Под «форматом Unix» вы имеете в виду использование «\ n» в качестве ограничителя строки вместо «\ r \ n»? Просто установите системное свойство line.separator
перед созданием PrintWriter.
В качестве демонстрации:
import java.io.*;
public class Test
{
public static void main(String[] args)
throws Exception // Just for simplicity
{
System.setProperty("line.separator", "xxx");
PrintWriter pw = new PrintWriter(System.out);
pw.println("foo");
pw.println("bar");
pw.flush();
}
}
Конечно, это устанавливает его для всей JVM, что не идеально, но может быть всем, что вам нужно.
Предполагая, что проблема форматирования, о которой вы говорите, заключается в том, что разрывы строк в Windows - это перевод строки возврата каретки ( «\ r \ n»
), а символы Unix - перевод строки ( "\ n"
), самый простой способ убедиться, что в вашем файле используется LF, а не CRLF, - отказаться от println
и вместо этого использовать print ("\ n")
для завершения строк.
Итак, вместо:
writer.println("foo,bar,88");
используйте
writer.print("foo,bar,88\n");
Вы можете просто выполнить поиск в соответствующих файлах для println
, чтобы убедиться, что вы поймаете их все.