【问题标题】:Funny issue with MariaDB fieldMariaDB 字段的有趣问题
【发布时间】:2016-05-01 14:50:50
【问题描述】:

我正在尝试保存一些以货币符号为前缀的值,例如 10 欧元。然而,当我在数据库中手动输入它们时,欧元符号会时不时地转动?然后,当我查询该行时,有时会再次获得带有值的问号,而其他时候则获得完整值的 NaN。 如果我使用电子邮件字段或唯一标识符查询该行,问题就会发生变化。使用 $ 或 ® 代替 € 没有问题;不过,即使 ™ 变成了 ?。

奇怪的是,如果我尝试用原始字符替换问号,MariaDB 会抱怨该行没有任何变化,就像那个字符实际上存在,即使没有显示!

我尝试重新启动 MariaDB,以防万一,但问题仍然存在。 我使用 UTF32 进行编码,使用 utf32_unicode_ci 进行排序。 我正在用 Sequel_pro 测试这个东西,甚至没有接触 php 来堆叠东西。 无论如何,如果我从 php 脚本执行查询并使用 JSON 解析结果,我会得到 null 的值。

这些特殊字符可能有什么问题?

【问题讨论】:

  • 除非您用于将数据编辑到数据库中的工具的编码方式与数据库的编码方式相同,否则您会遇到这样的问题。 UTF-8 还不足以满足您的需求吗?
  • 另一个 3d 提到了更改所有表的设置的选项,但我不知道如何在 SequelPro 中执行此操作。
  • 使用 UTF8 没有任何改变,当我查询该行时,€ 再次变为 ?.
  • 这不是我想说的。我是说如果你将 ascii 输入到 UTF-Anything 中,它会导致问题。您必须确保用于添加 € 符号的任何内容也使用相同的编码

标签: mysql mariadb utf


【解决方案1】:

计划 A:将金额存储为字符串,尝试从中获取价值。正如已经提到的,这需要“一直使用 utf8”。

B 计划:仅将金额存储在数字字段中。将“货币”存储在另一个字段中作为“欧元”或“美元”或......或者简单地假设所有金额都是欧元。然后在打印时将欧元符号放在金额前面。

不要使用DOUBLEFLOAT,你会得到一个不受欢迎的额外舍入。相反,请考虑DECIMAL(11,2)。这将完全处理大多数国家的金额。 (少数国家需要小数点后 4 位;有些国家可以使用 0。)

不要使用 utf32;使用 utf8(或 utf8mb4)。

数据库是数据的存储库,而不是格式化工具。保持这种区别将有助于避免此类问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2011-02-02
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多