Sql 法语和西班牙语的特殊字符可以在一个varchar中进行吗?

Sql 法语和西班牙语的特殊字符可以在一个varchar中进行吗?,sql,unicode,character-encoding,varchar,Sql,Unicode,Character Encoding,Varchar,法语和西班牙语中有特殊的字符,在普通英语中不使用(重音元音等) varchar中是否支持这些字符?或者我需要一个nvarchar给他们 (注意:我不想讨论是否应该使用nvarchar或varchar。)您必须使用nvarchar 大多数角色都适合varchar,但有些不适合,为什么要冒险呢 相关问题 我不确定,但其中一个排序规则可能适合西班牙语和法语,但这需要进行研究 您在谈论什么样的SQL实现 我可以谈谈微软的Sql Server;其他SQL实现,没有那么多 对于Microsoft SQL

法语和西班牙语中有特殊的字符,在普通英语中不使用(重音元音等)

varchar中是否支持这些字符?或者我需要一个nvarchar给他们


(注意:我不想讨论是否应该使用nvarchar或varchar。)

您必须使用nvarchar

大多数角色都适合varchar,但有些不适合,为什么要冒险呢

相关问题


我不确定,但其中一个排序规则可能适合西班牙语和法语,但这需要进行研究

您在谈论什么样的SQL实现

我可以谈谈微软的Sql Server;其他SQL实现,没有那么多

对于Microsoft SQL Server,默认排序规则为
SQL\u Latin1\u General\u CP1\u CI\u AS
(Latin 1 General,保留大小写,不区分大小写,区分重音)。它允许以单字节形式(varchar)而不是双字节形式(nvarchar)对大多数西欧语言进行往返表示

它构建在“Windows1252”代码页上。该代码页实际上是ISO-8859-1,代码点范围0x80–0x9F由一组可选的标志符号表示,包括0x80处的欧元符号。ISO-8859-1将代码点范围指定为无图形表示的控制字符

ISO-8859-1由Unicode基本多语言平面的前256个字符组成,覆盖8位字符(0x00–0xFF)的整个域。有关详细信息和比较,请参阅

使用这种排序顺序很难的西欧语言包括(但不一定限于)拉脱维亚语、立陶宛语、波利希语、捷克语和斯洛伐克语。如果需要支持这些,则需要使用不同的排序规则(SQLServer提供了大量排序规则),或者使用nvarchar

应该注意,在数据库中混合排序规则往往会导致问题。只有在必要的时候,并且在理解如何使用默认排序规则时,才应该偏离默认排序规则


我怀疑Oracle和DB2提供了类似的支持。我不知道MySQL或其他实现。

可以存储在varchar字段中的字符完全取决于为该特定字段定义的代码页。如果有特定的字符需要存储,那么可以选择一个代码页来存储这些字符,它应该可以工作。糟透了

我的建议是始终使用nvarchar在SQL数据库中存储字符串。事实上,我认为非Unicode字符编码是一个bug,无论是在数据库中还是在其他任何地方。 您的操作系统在内部使用Unicode(无论是Windows、Mac、Linux还是其他)。JVM和.NET Framework在内部使用Unicode。每次查询数据库时进行代码页转换是毫无意义的。每次写入数据库时进行代码页转换是没有意义的。只需使用一个nvarchar列,您的字符串将直接从应用程序传输到数据库,无需进行字符转换查找、无回退编码错误处理程序、无wierd字符或意外问号

通过对数据库中的所有字符串数据使用nvarchar,并在任何地方使用Unicode,您都可以不再关心编码,现在和永远专注于应用程序的核心功能

今天是放弃传统角色编码的日子


为您后面的维护人员这样做。为你的孩子做这件事。你自己做吧。

一些很好的信息,特别是尼古拉斯·凯里的信息,但是没有人直接回答你的问题

是的,您可以使用varchar处理法语和西班牙语的混合,前提是您的字符集是Windows-1252(或类似的现代超集ISO-8859-1,带有一些额外的字符,如欧元符号)。在SQL Server中,通过设置排序规则(服务器范围、每个数据库或每列)来选择字符集:*Latin1*排序规则使用Windows-1252。在MySQL中,Windows-1252被称为Latin1


请注意,如果您试图将角色存储在所选角色集的指令集之外,系统可能会抛出错误,或者将该角色从其指令集无声地咀嚼到类似的指令集中。例如,SQL Server会将波兰语Ł转换为简单的L,但会为日语字符抛出一个错误。

此语句是错误的:“Windows 1252”代码页,即ISO-8859-1”。不,不是!Windows-1252不是ISO-8859-1。Windows-1252不是ISO-8859-1。Windows-1252不是ISO-8859-1。我告诉你三次的都是真的。那么,也许你真的应该读一读这句话:它建立在“Windows 1252”代码页上,即ISO-8859-1,代码点范围为0x80-0x9F…替换为替换的glyphs。这是一个真实的说法。这就是ISO-8859-1和Windows 1252之间的增量。这就是“吃嫩芽和叶子”的问题:一个放错位置的逗号会完全改变句子的意思。通过将逗号放在with前面,可以将其更改为其他内容。这就像“我会问我的朋友,谁(碰巧)吃了椰菜”和“我会问我的朋友,谁吃了椰菜”之间的区别,明白吗?如果它读到“它是建立在Windows-1252上的,与ISO-8859-1类似,只是代码点范围……”就会清楚得多。请注意,“代码页”对我们许多人来说是一个外来词,当然没有附加信息,因此应该省略。假装Latin1是Windows-1252的意思也是非常邪恶的。它没有!Latin1是ISO-8859-1的IANA注册别名,不适用于Windows-1252。这只是微软欺骗美国的又一个恶劣例子