【问题标题】:Altering Mysql Table column to be case sensitive将 Mysql 表列更改为区分大小写
【发布时间】:2011-03-24 16:48:18
【问题描述】:

我的 Mysql 数据库中有一个表,用于身份验证。现在,我需要使身份验证区分大小写。 谷歌搜索,我意识到 Mysql 列对于搜索操作是不区分大小写的(与 Oracle 相反),并且可以在创建表时通过指定“二进制”即更改默认行为。

CREATE TABLE USERS
(
    USER_ID SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    USER_NAME VARCHAR(50) BINARY NOT NULL
)

谁能告诉我如何更改 Mysql 中的表以将“二进制”添加到数据库的现有列?

谢谢!

【问题讨论】:

  • 您无需将其设为二进制即可使其区分大小写。如果是 varchar,使用 collat​​ion = latin1_general_cs

标签: mysql


【解决方案1】:

你应该可以做这样的事情:

编辑:误读了您的意图:

    ALTER TABLE USERS MODIFY
        USER_NAME VARCHAR(50)
          CHARACTER SET binary;

【讨论】:

  • 以下对我有用:ALTER TABLE UserAccounts CHANGE Password Password varchar(50) NOT NULL COLLATE utf8_bin;
【解决方案2】:

请看http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

例子:

ALTER TABLE some_table MODIFY some_column BLOB;
ALTER TABLE some_table MODIFY some_column VARCHAR(50) BINARY;

第一行转换为二进制数据类型(尽量减少字符丢失),第二行转换回VARCHAR 类型,使用BINARY 排序规则。

实际上,存储为二进制类型之一(BLOBBINARYVARBINARY)可能比简单地整理BINARY 更可取。我建议你比较一下,你的里程可能会根据你的实际数据和你需要运行的查询而有所不同。

【讨论】:

    【解决方案3】:
    ALTER TABLE USERS CHANGE USER_NAME USER_NAME VARCHAR(50) BINARY NOT NULL;
    

    【讨论】:

    • 引用mysql文档dev.mysql.com/doc/refman/5.1/en/alter-table.html,“如果你想改变一个列的类型而不是名字,CHANGE语法仍然需要一个旧的和新的列名,即使它们是相同的。”
    • 如果有人错过了文档,如果您不更改列名,则可以使用 MODIFY 而不是 CHANGE。在这种情况下,您只需提供一次列名。
    • @deinst,VARCHAR(50) BINARY 和 VARBINARY(50) 不一样吗?
    【解决方案4】:

    您仍然可以在验证时对您的表执行区分大小写的查询,而不是更改您的表,请使用 BINARY 选项,如下所示:

    SELECT BINARY * FROM USERS where USER_ID = 2 AND USER_NAME = 'someone' LIMIT 1;
    

    这有帮助吗?

    【讨论】:

    • 根据上述情况,SomeOne的用户名将返回false。
    • 这给每个查询增加了很大的开销。如果必须始终返回二进制数据,为什么要在每次访问时都转换它?这就是我们所说的“杂牌”。
    • 也许我不理解,下面的语句是否意味着将来会进行 case SENSITIVE 检查? ALTER TABLE 用户更改 USER_NAME USER_NAME VARCHAR(50) BINARY NOT NULL;据我了解,每个登录身份验证都需要区分大小写。
    • 感谢大家的回复,是的,我设法使用你们提供的 ALTER 语法来做到这一点。我对 MySQL 手册的语法中的字符集感到困惑。
    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 2010-10-30
    • 2011-03-18
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多