法语和西班牙语中有特殊字符,不能用于普通英语(重音元音等)。
varchar中是否支持这些字符?或者我需要nvarchar吗?
(注意:我不想讨论我是否应该使用nvarchar或varchar。)
答案 0 :(得分:12)
您在谈论什么SQL实现?
我可以谈论Microsoft Sql Server;其他SQL实现,不是那么多。
对于Microsoft SQL Server,默认排序规则为SQL_Latin1_General_CP1_CI_AS
(拉丁语1常规,保留大小写,不区分大小写,区分重音)。它允许以单字节形式(varchar)而不是双字节形式(nvarchar)来往返表示大多数西欧语言。
它建立在“Windows 1252”代码页上。该代码页实际上是ISO-8859-1,代码点范围0x80-0x9F由一组备用字形表示,包括0x80处的欧元符号。 ISO-8859-1指定代码点范围作为控制字符,没有图形表示。
ISO-8859-1由Unicodes Basic Multilinigual Plane 的前256个字符组成,覆盖8位字符(0x00-0xFF)的整个域。有关详细信息和比较,请参阅
西欧语言将很难与此整理顺序包括(但不一定限于)拉脱维亚语,立陶宛语,Polich语,捷克语和斯洛伐克语。如果你需要支持那些,你需要使用不同的排序规则(SQL Server提供了大量的排序规则),或者转而使用nvarchar。
应该注意,在数据库中混合排序往往会导致问题。偏离默认排序规则应该只在必要时进行,并了解如何用脚射击自己。
我怀疑Oracle和DB2提供了类似的支持。我不知道MySQL或其他实现。
答案 1 :(得分:5)
你必须使用nvarchar。
http://theniceweb.com/archives/156
大部分字符都适合varchar但有些字符不适合,为什么要承担风险。
相关问题
When must we use NVARCHAR/NCHAR instead of VARCHAR/CHAR in SQL Server?
答案 2 :(得分:4)
可以存储在varchar字段中的字符完全取决于为该特定字段定义的代码页。如果您要存储特定字符,则可以选择存储这些字符的代码页,它应该可以使用。不好。
我的建议是始终使用nvarchar在SQL数据库中存储字符串。事实上,我认为非Unicode字符编码是一个错误,无论是在数据库中还是在其他任何地方。
您的操作系统在内部使用Unicode(无论是Windows,Mac,Linux还是其他)。 JVM和.NET Framework在内部使用Unicode。每次查询数据库时都没有必要进行代码页转换。每次写入数据库时都没有必要进行代码页转换。只需使用一个nvarchar列,您的字符串将直接从您的应用程序转到数据库未触摸 - 没有字符转换查找,没有回退编码错误处理程序,没有奇怪的字符或意外的问号。
通过将nvarchar用于数据库中的所有字符串数据 - 以及通常无处不在的Unicode - 您可以停止使用编码来关注自己,并立即专注于应用程序的核心功能。
今天是放弃遗留字符编码的日子。
为那些追随你的维护者做这件事。为你的孩子做。为自己做。
答案 3 :(得分:2)
我不确定,但这些排序规则中的一个可能适合西班牙语和法语,但这必须进行研究。
http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html
答案 4 :(得分:2)
一些优秀的信息,特别是来自Nicholas Carey的信息,但没有人直接对你的问题给出是/否答案......
是的,您可以使用varchar来处理法语和西班牙语的混合,提供您的字符集是Windows-1252(或类似的现代超集ISO-8859-1,还有一些额外的字符像欧元符号)。在SQL Server中,通过设置排序规则(服务器范围,每个数据库或每列)来选择字符集:* Latin1 *排序规则使用Windows-1252。在MySQL中,Windows-1252称为Latin1。
请注意,如果您尝试将字符存储在所选字符集的所有字符集之外,系统可能会抛出错误,或者将字符静默地从其保留的字符串中删除。例如。 SQL Server会将波兰语Ł简化为L,但会为日语字符抛出错误。