Тимчасовий обхід обмеження довжини varchar
Сергій Галашин - 09/14/2010
В одному з моїх поточних проектів у процесі розробки процесу імпорту великих об’ємів даних виникла задача ефективно (швидко) обійти обмеження довжини varchar полів у базі даних. Фактично, ми готові були пожертвувати частиною даних задля збереження швидкості роботи.
Річ у тім, що MySQL за умовчанням не дозволяє запхати в поле varchar рядок довший за наперед визначену розмірність.
Але це можна обійти скинувши налаштування @@sql_mode.
В якості демонстрації принципу наведу шмат коду, коментарі мають все пояснити.
<!---
CREATE TABLE IF NOT EXISTS contacts (
contactId int(10) unsigned NOT NULL AUTO_INCREMENT,
salutation varchar(5) DEFAULT NULL,
firstname varchar(255) DEFAULT NULL,
PRIMARY KEY (contactId)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--->
<cfset local = {} />
<cfset local.value = "Doctor" />
<!--- save the current SQL mode --->
<cfquery datasource="my_test_dsn" name="local.getSqlMode">
select @@sql_mode as sqlmode
</cfquery>
<!--- reset the SQL mode --->
<cfquery datasource="my_test_dsn" result="local.resetSqlMode">
set sql_mode = ''
</cfquery>
<!--- this should work fine --->
<cfquery datasource="my_test_dsn" result="local.pushContact">
INSERT INTO contacts (salutation, firstname) VALUES ('#local.value#', '#local.value#')
</cfquery>
<!--- restore the SQL mode --->
<cfquery datasource="my_test_dsn" result="local.revertSqlMode">
set sql_mode = '#local.getSqlMode.sqlmode#'
</cfquery>
<!--- this should fail --->
<cfquery datasource="my_test_dsn" result="local.pushContact">
INSERT INTO contacts (salutation, firstname) VALUES ('#local.value#', '#local.value#')
</cfquery>
<cfdump var="#local#">