MariaDB 字段的有趣问题
Funny issue with MariaDB field
我正在尝试保存一些以货币符号为前缀的值,例如 10 欧元。然而,当我在数据库中手动输入它们时,欧元符号时不时地变成?。当我查询该行时,我有时会再次得到带有值的问号,有时会得到 NaN 的完整值。
如果我使用电子邮件字段或唯一标识符查询该行,问题就会发生变化。使用 $ 或 ® 代替 € 没有问题;不过,甚至 ™ 都变成了 ?
奇怪的是,如果我尝试用原始字符替换问号,MariaDB 会抱怨该行没有任何变化,就像该字符即使没有显示也确实存在一样!
为了以防万一,我尝试重新启动 MariaDB,但问题仍然存在。
我使用 UTF32 进行编码,使用 utf32_unicode_ci 进行整理。
我正在用 Sequel_pro 测试这个东西,甚至没有触及 php 不要堆叠东西。
无论如何,如果我从 php 脚本执行查询并使用 JSON 解析结果,我得到的值为 null。
这些特殊字符可能有什么问题?
计划 A:将金额存储为字符串并不尝试从中获取值。如前所述,这需要 "utf8 all the way through".
方案 B:仅将金额存储在数字字段中。在另一个字段中将 'currency' 存储为 'EUR' 或 'USD' 或 ... 或者简单地假设所有金额都是欧元。然后打印的时候把欧元符号放在金额前面。
不要使用 DOUBLE
或 FLOAT
,您会得到不希望的额外舍入。相反,请考虑 DECIMAL(11,2)
。这将恰好处理大多数国家/地区的金额。 (一些国家需要小数点后 4 位;有些国家可以接受 0。)
不要使用utf32;使用 utf8(或 utf8mb4)。
数据库是数据存储库,而不是格式化工具。保持这种区别将有助于避免这样的问题。
我正在尝试保存一些以货币符号为前缀的值,例如 10 欧元。然而,当我在数据库中手动输入它们时,欧元符号时不时地变成?。当我查询该行时,我有时会再次得到带有值的问号,有时会得到 NaN 的完整值。 如果我使用电子邮件字段或唯一标识符查询该行,问题就会发生变化。使用 $ 或 ® 代替 € 没有问题;不过,甚至 ™ 都变成了 ?
奇怪的是,如果我尝试用原始字符替换问号,MariaDB 会抱怨该行没有任何变化,就像该字符即使没有显示也确实存在一样!
为了以防万一,我尝试重新启动 MariaDB,但问题仍然存在。 我使用 UTF32 进行编码,使用 utf32_unicode_ci 进行整理。 我正在用 Sequel_pro 测试这个东西,甚至没有触及 php 不要堆叠东西。 无论如何,如果我从 php 脚本执行查询并使用 JSON 解析结果,我得到的值为 null。
这些特殊字符可能有什么问题?
计划 A:将金额存储为字符串并不尝试从中获取值。如前所述,这需要 "utf8 all the way through".
方案 B:仅将金额存储在数字字段中。在另一个字段中将 'currency' 存储为 'EUR' 或 'USD' 或 ... 或者简单地假设所有金额都是欧元。然后打印的时候把欧元符号放在金额前面。
不要使用 DOUBLE
或 FLOAT
,您会得到不希望的额外舍入。相反,请考虑 DECIMAL(11,2)
。这将恰好处理大多数国家/地区的金额。 (一些国家需要小数点后 4 位;有些国家可以接受 0。)
不要使用utf32;使用 utf8(或 utf8mb4)。
数据库是数据存储库,而不是格式化工具。保持这种区别将有助于避免这样的问题。