【问题标题】:Character a is the same as A in MySQL database字符 a 与 MySQL 数据库中的 A 相同
【发布时间】:2012-06-27 13:17:40
【问题描述】:

我想开发一个短url系统,比如bitly,我的数据库有问题。我无法区分数据库中的 a 和 A。

这是我保存在数据库中的:

1   aaaaaaa a   a   a   a   a   a   a   aaaaaaa 1340802562  
3   aaaaaab a   a   a   a   a   a   b   aaaaaab 1340802562  
5   aaaaaac a   a   a   a   a   a   c   aaaaaac 1340802562  
7   aaaaaad a   a   a   a   a   a   d   aaaaaad 1340802562

在 id 2,我应该有 aaaaaaB。这是表结构属性:

1   id  bigint(20)      UNSIGNED    Nu  None    AUTO_INCREMENT    Schimbare   Aruncă     More 
     2  combination varchar(8)  utf8_general_ci     Nu  None          Schimbare   Aruncă     More 
     3  a   varchar(2)  utf32_general_ci        Nu  None          Schimbare   Aruncă     More 
     4  b   varchar(2)  utf8_general_ci     Nu  None          Schimbare   Aruncă     More 
     5  c   varchar(2)  utf8_general_ci     Nu  None          Schimbare   Aruncă     More 
     6  d   varchar(2)  utf8_general_ci     Nu  None          Schimbare   Aruncă     More 
     7  e   varchar(2)  utf8_general_ci     Nu  None          Schimbare   Aruncă     More 
     8  f   varchar(2)  utf8_general_ci     Nu  None          Schimbare   Aruncă     More 
     9  g   varchar(2)  utf32_general_ci        Nu  None          Schimbare   Aruncă     More 
     10 url varchar(255)    utf8_general_ci     Nu  None          Schimbare   Aruncă     More 
     11 time    int(10)         Nu  None          Schimbare   Aruncă     More 
     12 status  int(10)         Nu  None          Schimbare   Aruncă     More 

这是代码:

<?php
require_once('Controller.php');

class ShortLink extends Controller {
  public $chars="aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPq1Qr2Rs3St4Tu5Uv6Vw7Wx8Xy9Yz0Z";
  public function generate() {
    $this->DBconnect();
    echo $length = strlen($this->chars);
    for($a=0;$a<$length;$a++) {
      for($b=0;$b<$length;$b++) {
        for($c=0;$c<$length;$c++) {
          for($d=0;$d<$length;$d++) {
            for($e=0;$e<$length;$e++) {
              for($f=0;$f<$length;$f++) {
                for($g=0;$g<$length;$g++) {
                  $combination = $this->chars[$a].$this->chars[$b].$this->chars[$c].$this->chars[$d].$this->chars[$e].$this->chars[$f].$this->chars[$g];
                  mysql_query("
                    INSERT INTO `short` (
                      `id`,
                      `combination`,
                      `a`,
                      `b`,
                      `c`,
                      `d`,
                      `e`,
                      `f`,
                      `g`,
                      `url`,
                      `time`,
                      `status`
                    )
                    VALUES (
                      NULL,  '".($combination)."', '".($this->chars[$a])."',  '".($this->chars[$b])."',  '".($this->chars[$c])."',  '".($this->chars[$d])."',  '".($this->chars[$e])."',  '".($this->chars[$f])."',  '".($this->chars[$g])."',  '".($combination)."',  '".(time())."',  '0');");
                }
              }
            }
          }
        }
      }
    }
    $this->DBdisconnect();
  }
}
$ShortLink = new ShortLink();
$ShortLink->generate();
?>

【问题讨论】:

    标签: php mysql unicode utf-8


    【解决方案1】:

    看到所有utf8_general_cis 了吗? _ci 部分表示排序规则不区分大小写。

    http://dev.mysql.com/doc/refman/5.6/en/charset-unicode-sets.html

    【讨论】:

    【解决方案2】:

    “a”与“A”相同的原因是你的排序规则:utf8_general_ci

    末尾的“ci”代表“不区分大小写”。

    您需要更改排序规则。

    【讨论】:

    • 为什么不直接使用utf8_general_cs?如果您要存储二进制数据,那么utf8_bin 很好,否则我只会使用区分大小写的变体。
    • 我在 mysql 的下拉框中没有看到任何 _cs :(
    • 对不起,我忘了 MySQL 不支持区分大小写的 unicode。您可以更改为latin1_general_cscp1251_general_cs
    • 我的选项中没有 _cs,我将其更改为 utf8_bin,现在可以了:D
    • 好的,请注意utf8_bin 使用代码点,因此它不区分重音字符和非重音字符(例如)。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 2021-04-25
      • 1970-01-01
      • 2023-03-14
      • 2017-02-19
      • 2015-10-05
      • 2013-08-24
      • 2019-01-24
      • 2015-09-14
      相关资源
      最近更新 更多