PHP + MySQL + 西班牙语

Posted

技术标签:

【中文标题】PHP + MySQL + 西班牙语【英文标题】:PHP + MySQL + Spanish 【发布时间】:2017-01-05 06:40:12 【问题描述】:

我的系统处理西班牙数据。我正在使用 laravel + mysql。我的数据库排序规则是 latin1 - 默认排序规则,我的表结构如下所示:

CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET latin1 NOT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=298 DEFAULT CHARSET=utf8mb4;

有几个问题:

    我将数据从文件加载到数据库。这是一个好习惯 utf8_encode($name) 在插入数据库之前?我目前正在这样做, 否则一些比较抛出错误:SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_unicode_ci,COERCIBLE) for operation '='

    如果使用 utf8_encode 是要走的路,我是否需要 utf8_encode 甚至我想搜索的名称?即选择...其中名称= utf8_encoded(name)?

    是否有任何缺陷或更好的方法来处理上述问题?因为我第一次做西班牙语(带重音的字符)。

【问题讨论】:

我的印象是 MySQL 中的 VARCHARs 默认为 UTF8,因此您在使用它们时不必使用 utf8_encode @MartinParkin 更新了我在没有 utf8 编码的情况下插入数据时遇到的错误。然后使用 = 过滤器进行选择。 【参考方案1】:

您的product.name 列具有字符集latin1。你懂的。它也有排序规则latin1_swedish_ci。这是默认设置。 MySQL 的最初开发者是瑞典人。因为您使用的是西班牙语,您可能希望使用latin1_spanish_ci 进行整理;它在N 之后排序Ñ。其他拉丁语排序规则将它们排序在一起。

因为您的 product.name 列存储在 latin1 中,所以在将文本存储到该文本之前,在文本上使用 utf8_encode() 是一个,而不是 的想法列。

最好的做法是为所有列设置字符集utf8mb4,尤其是在您的应用程序是新应用程序的情况下。这意味着更改 name 列的定义字符集。然后,您可以在存储之前将文本字符串转换为 unicode。

您最好也为每个表设置默认排序规则utf8mb4_spanish_ci。排序规则被烘焙到 varchar() 列的索引中。 (如果您使用的是传统西班牙语,其中ch 是一个不同的字母,请使用utf8mb4_spanish2_ci。)

【讨论】:

以上是关于PHP + MySQL + 西班牙语的主要内容,如果未能解决你的问题,请参考以下文章

PHP PHP - 多格式日期西班牙语

PHP 使用PHP检测Bot,Crawlers和Spiders(西班牙语)

如何在 MySQL 中插入西班牙语字符?

PHP 列表(数组)的月份(西班牙语)

PHP-多格式日期西班牙语

在 mysql 或 php 中使用 utf 字符排序?最佳解决方案